为什么 AddCrossOriginWhitelistEntry 或 IsCorsEnabled 不允许使用自定义方案处



>上下文

我们使用 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,
});

我终于解决了。这与CEFSharpAngular无关.该错误具有误导性,问题是服务器未设置为允许 CORS。就我而言,服务器应用程序Asp.Net Core且易于为我的http://embedded自定义方案处理程序启用:

1:将Microsoft.AspNetCore.Corsnuget 包添加到服务器应用程序。

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());
}

最新更新