Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CORS策略-Blazor客户端Web程序集已阻止对获取的访问_C#_Asp.net Core_Cors_Blazor_Blazor Webassembly - Fatal编程技术网

C# CORS策略-Blazor客户端Web程序集已阻止对获取的访问

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'标头。如果不透明响应满足您的需要,请将请求的模式设

我有一个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中的客户端配置

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的调用,然后将其传递给客户端。这就是你最后的建议吗?我已经更新了我的答案以反映你的评论。