>上下文
我们使用 CefSharp (v57.0( 托管 Angular2 (v4.2( 应用程序,该应用程序使用 Web 应用程序和游戏 UI 客户端之间的共享组件。游戏客户端旨在从 CEFSharp 容器内向服务器发出请求。
客户端游戏应用程序在从嵌入资源加载的单个index.html
中加载。本文基于这篇使用 Angular、Bootstrap 和 C# 创建桌面应用程序一文。
问题
当我向服务器发出请求时,CEF 游戏客户端会记录以下错误:
http://localhost:53462/Some/Api/Method。对预检请求的响应未通过访问控制检查:请求的资源上不存在"访问控制允许源"标头。因此,不允许访问源"http://embedded"。
CEF 初始化后,我调用Cef.AddCrossOriginWhitelistEntry("http://embedded", "http", "localhost:53462", true);
返回true,表示应该允许它。为什么它没有将域名列入白名单?
法典
精简的资源处理程序:
public class EmbeddedResourceHandlerFactory : ISchemeHandlerFactory
{
private Assembly assembly = null;
public EmbeddedResourceHandlerFactory(Assembly assembly)
{
this.assembly = assembly;
}
public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
{
// Calculate the resource being loaded
Uri uri = new Uri(request.Url);
string path = uri.PathAndQuery + uri.Fragment;
// Calculate the final path of the embedded resource
string mime = ResourceHandler.GetMimeType(Path.GetExtension(path));
path = $"{assembly.GetName().Name}.Views{path}".Replace("/", ".");
if (!assembly.GetManifestResourceNames().Any(x => x.Equals(path)))
return null;
// Create the resource handler
Stream stream = assembly.GetManifestResourceStream(path);
return ResourceHandler.FromStream(stream, mime);
}
}
这是它的注册方式
settings.RegisterScheme(new CefCustomScheme()
{
SchemeName = "http",
DomainName = "embedded",
SchemeHandlerFactory = new EmbeddedResourceHandlerFactory(assembly),
IsCorsEnabled = true,
});
我终于解决了。这与CEFSharp
或Angular
无关.该错误具有误导性,问题是服务器未设置为允许 CORS。就我而言,服务器应用程序Asp.Net Core
且易于为我的http://embedded
自定义方案处理程序启用:
1:将Microsoft.AspNetCore.Cors
nuget 包添加到服务器应用程序。
2:将 Cors 服务添加到Startup.cs
的配置服务方法中。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
}
3:告诉Startup.cs
的配置方法使用 Cors
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
app.UseCors(options => options.WithOrigins("http://embedded").AllowAnyMethod());
}