C# CORS策略-Blazor客户端Web程序集已阻止对获取的访问
我有一个blazor web程序集,它从一个构建在ASP.NET核心上的外部API获取,我没有访问该API的权限。我可以执行get请求,但不能执行post请求。当我这样做时,我得到了以下错误 在'http://external:9000/User/Create“起源”http://localhost:56138'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源 api的作者确认他在启动时启用了cors允许任何标题,并建议我也这样做,但这并没有解决问题。我从调试器中确认,我正在发送端点所需的正确数据格式,并且我也在与web服务相同的http方案上运行 这是program.cs中的客户端配置C# CORS策略-Blazor客户端Web程序集已阻止对获取的访问,c#,asp.net-core,cors,blazor,blazor-webassembly,C#,Asp.net Core,Cors,Blazor,Blazor Webassembly,我有一个blazor web程序集,它从一个构建在ASP.NET核心上的外部API获取,我没有访问该API的权限。我可以执行get请求,但不能执行post请求。当我这样做时,我得到了以下错误 在'http://external:9000/User/Create“起源”http://localhost:56138'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。如果不透明响应满足您的需要,请将请求的模式设
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri("http://external:9000/") });
builder.Services.AddCors(policy =>
{
policy.AddPolicy("_myAllowSpecificOrigins", builder => builder.WithOrigins("http://external:9000/")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
这就是我发布的方式
var dataJson = JsonConvert.SerializeObject(application);
var stringContent = new StringContent(dataJson, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync($"User/Create", stringContent);
我已经读过这是blazor assembly的一个常见问题,我不完全确定我读到了什么。我目前正在尝试将该项目移动到blazor服务器,看看它是否能工作,但我更喜欢在web组装上使用它
builder.Services.AddCors(policy =>
{
policy.AddPolicy("_myAllowSpecificOrigins", builder => builder.WithOrigins("http://external:9000/")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
此配置应该在服务器上完成,而不是在您的服务器上,而是在外部API的服务器上完成。在这方面您什么也不做,除了在Web Api上调用端点
api的作者确认,他已启用cors,允许在启动时使用任何标头
如果是这样的话,请他提供代码以供确认
并建议我也这样做,但这并没有解决问题
你什么也不做
解决方案:
由于CORS是浏览器强制执行的JavaScript的一个安全特性,因此可以通过调用服务器代码来绕过它,从服务器代码执行对该Web Api端点的调用,然后将其返回到WebAssembly前端。尽可能多地使用异步代码
根据评论更新
你是说我应该在一个解决方案下有两个项目,服务器和客户端?服务器调用外部api的调用,然后将其传递给客户端。这就是你最后的建议吗 如果您使用的是托管服务器包含Web Api控制器的WebAssembly Blazor应用程序,那么您应该公开可以从WebAssembly前端调用的端点。这些端点中的代码应该执行对外部Web Api的HTTP调用,并将从外部Web Api接收的数据传递回WebAssembly调用方法 注意:如果您没有这样的控制器(默认情况下,它们是由Visual Studio创建的),您可以自己将它们添加到服务器项目中 如果已经创建了Web Api项目而不是那些控制器,则从Web Api项目中公开必要的端点。请注意,只要提供正确的Url,Web Api项目是否驻留在WebAssembly前端的同一个解决方案中没有区别
如果您单独使用WebAssembly Blazor应用程序;也就是说,默认安装不会创建服务器项目,您需要创建一个Web Api项目并使用它,除非您已经创建了一个。在客户端上使用
。AddCors(…)
。看起来其他作者可能允许任何标题,但不允许任何方法。问题出在服务器上。但如果您无法修复该问题,Blazor服务器不应出现此问题。@HenkHolterman我正是这么想的。我只是迫不及待地添加了它。你可以编写自己的API层作为中间人。允许您仍然使用Blazor Wasm。@Henkholtman我让它在Blazor服务器上运行。我想我会坚持下去。我不必担心应用程序在某些浏览器上无法运行,比如web assembly提供的问题。你是说我应该在一个解决方案下有两个项目,服务器和客户端?服务器调用外部api的调用,然后将其传递给客户端。这就是你最后的建议吗?我已经更新了我的答案以反映你的评论。