为了说明我的问题,当您创建一个带有API端点的新项目时,我使用了默认的ASP.Net Core项目设置。这是我的Get
动作方式的控制器:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
这是我在Startup
类中的Configure
方法(如您所见,我在一开始添加了app.UseCors()
(:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
默认情况下,服务器在https://localhost:44391/
上运行。现在,我的期望是,使用这样的默认设置,所有不是来自https://localhost:44391/
的CORS请求都应该被CORS策略阻止。为了验证我做了以下步骤:
- 我启动了服务器,并在
Get
方法中设置了一个断点 - 为了模拟跨域(CORS(请求,我去了任何一个randon网站,例如。https://stackoverflow.com/打开Chrome开发工具,并在控制台中运行以下javascript,请求我的get方法:
fetch("https://localhost:44391/weatherforecast").then(r=>r.text()).then(console.log);
- 现在,我预计服务器将发送一个CORS错误,并且我的
Get
方法将永远不会执行 - 实际发生的情况是,我的
Get
方法中的断点被击中,该方法被执行。只是在那之后,我在浏览器控制台中看到了CORS错误
我认为这种行为是错误的,因为如果请求来自另一个来源,我真的希望避免我的Get
操作方法被完全执行。
所以基本上可以归结为两个问题:
- 为什么ASP.Net Core CORS策略以这种方式工作
- 是否有任何方法可以设置CORS,使所有操作方法永远不会执行,除非CORS策略允许?或者我需要为此编写一个自定义中间件吗
"实际发生的情况是,我的Get方法中的断点被击中并执行该方法。只是在那之后,我在我的浏览器控制台。。。我认为这种行为是错误的">
。。。不,这是预期的行为。CORS实际上是由浏览器根据服务器提供的标头以及请求是否受CORS限制来强制执行的。
服务器无法确定该请求是跨域AJAX请求还是其他类型的请求(因为HTTP请求中的数据不能可靠地提供这些信息(,因此无法直接拒绝该请求。它所能做的就是设置CORS头,告诉客户端如果请求实际上受到CORS限制,该做什么。
因此,如果您的请求到达服务器,它将始终被执行,只有当响应和标头返回到浏览器时,浏览器才会决定是否允许请求页面实际看到响应。
直接回答您的两个问题:
- 这就是CORS的工作原理,它不仅仅是ASP.NET。请参阅上面的解释
- 没有。同样,请参阅上面的解释。(这里唯一的例外是需要飞行前OPTIONS请求的请求,其中必须向服务器发出单独的初始HTTP OPTIONS申请-在这种情况下,除非OPTIONS要求指示允许请求,否则Action方法不会被命中。(
此优秀资源提供了更多详细信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS