我有一个问题,当我使httppost和httpput (httpget是OK的)到API .net core 3.1由Angular 10前端,在控制台应用程序中的错误是著名的:从源'http://localhost:4200'访问'http://localhost:23645/api/Toolbar/Search'的XMLHttpRequest已被CORS策略阻止:对预飞行请求的响应未通过访问控制检查:请求的资源上不存在'Access- control - allow - origin '标头。
捕获
这是我的前端请求的代码:
constructor(private Http: HttpClient) {
this.header = new HttpHeaders(
{
'content-type': 'application/json'
}
)
searchToolbar(search: string): Observable<ToolbarSearchResultItem[]> {
return this.Http.post(this.url + '/myController/Search', { "search": search }, { headers: this.header, withCredentials:true}).pipe(tap((response: myTyoe[]) => {
return response;
}));
这是我在Startup.cs中的代码:
public void ConfigureServices(IServiceCollection services)
{
log.Info("ConfigureServices");
try
{
IConfigurationRoot configurationRoot = builder.Build();
services.AddCors(opt => opt.AddPolicy("CorsPolicy", c =>
{
c.WithOrigins("http://localhost:4200")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
}));
services.AddAuthorization(options =>
{
options.AddPolicy("AllUsers", policy => policy.RequireAuthenticatedUser());
});
services.AddControllers();
services.AddMvc();
}
catch (Exception ex)
{
log.Error("Error in ConfigureServices" + ex.Message + ex.StackTrace);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
try
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseCors("CorsPolicy");
app.UseAuthorization();
中的启动设置。Json:
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:23645",
"sslPort": 0
}
和applicationhost.config中的
<windowsAuthentication enabled="true">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
this is my controller:
[HttpPost]
[Route("Search")]
[EnableCors("CorsPolicy")]
public IList<ToolbarSearchResultItem> Search(ToolbarSearch search)
{
//my code
}
是控制台中详细的消息:请求URL: http://localhost:23645/api/Toolbar/Search请求方式:OPTIONS状态码:401未授权远端地址:[::1]:23645推荐策略:strict-origin-when-cross-origincache - control:私人内容长度:6284内容类型:text/html;utf - 8字符集=日期:2021年3月2日(星期二)15:52:05 GMT服务器:microsoft iis/10.0WWW-Authenticate:谈判WWW-Authenticate: NTLMX-Powered-By: ASP。网Accept:/Accept- encoding: gzip, deflate, br接收语言:- fr, fr; q = 0.9, en - us; q = 0.8, en; q = 0.7Access-Control-Request-Headers:内容类型Access-Control-Request-Method:文章连接:维生主持人:localhost: 23645来源:http://localhost: 4200推荐人:http://localhost: 4200/Sec-Fetch-Dest:空Sec-Fetch-Mode:歌珥Sec-Fetch-Site:同一地点
this is my web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".MYEXE.exe" stdoutLogEnabled="false" stdoutLogFile=".logsstdout" hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
我认为这不是真正的CORS块问题,而是配置问题或其他问题,它非常类似于这个问题:CORS策略和。net Core 3.1的麻烦但我使用了分析器,我没有SQL问题
删除启动Cors配置
.AllowCredentials();
和remove from controller actions
[EnableCors("CorsPolicy")]
但是你仍然有状态码:401。这和科斯没有关系。这只是关于授权。只需注释所有授权代码以测试CORS。在此之后,您可以从授权开始。
从原点'http://localhost:4200'访问'http://localhost:23645/api/Toolbar/Search'的XMLHttpRequest已被CORS策略阻止:对预飞行请求的响应不通过访问控制检查:请求的资源上不存在'Access- control - allow - origin '标头。
请注意CORS飞行前请求(使用HTTPOPTIONS
方法)用于检查CORS协议是否被理解,服务器是否通过特定的方法和头来感知。HTTPOPTIONS
请求总是匿名的,您启用了Windows身份验证并禁用了匿名访问,这将导致服务器无法正确响应预飞行请求。
使用CORS在本地运行应用程序以进行测试,为了解决此问题,您可以尝试启用匿名身份验证以允许匿名访问。
此外,如果你要在IIS服务器上托管你的应用程序,要解决这个问题,你可以安装IIS CORS模块并为应用程序配置CORS。