如果对未指定origin
HTTP 请求标头的启用 CORS 的端点发出 HTTP 请求,则请求将失败并显示 HTTP 500 错误。
日志中的异常是:
[2019-04-13 14:40:04Z] fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
An unhandled exception has occurred while executing the request.
System.InvalidOperationException: Endpoint MartinCostello.Api.Controllers.TimeController.Get (API) contains CORS metadata, but a middleware was not found that supports CORS.
Configure your application startup by adding app.UseCors() inside the call to Configure(..) in the application startup code.
at Microsoft.AspNetCore.Routing.EndpointMiddleware.ThrowMissingCorsMiddlewareException(Endpoint endpoint)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
但是, app.Cors()
_has_ 已在app.UseEndpoints(...)
之前添加到应用程序中。
这似乎是由#9181 引入的。
如果请求没有origin
请求头,则跳过 CORS 中间件:
但是,端点中间件会在被调用的端点上找到 CORS 元数据,并通过在HttpContext
查找键来检查 CORS 中间件是否被调用(它确实被调用了,但被跳过了不需要)项目。 该项目不存在,因此抛出异常:
仅当origin
标头存在于请求中时才会添加端点中间件正在测试的密钥,该标头位于此处:
似乎有两种可能的修复方法是:
HttpContext.Items
,或者:origin
标头,并且仅在 HTTP 请求中存在 CORS 中间件未调用时抛出异常。[EnableCors(...)]
属性添加到控制器方法。如果没有提供origin
HTTP 请求头,则请求成功。
.NET Core SDK (reflecting any global.json):
Version: 3.0.100-preview4-011204
Commit: 621575bab1
Runtime Environment:
OS Name: Windows
OS Version: 10.0.17763
OS Platform: Windows
RID: win10-x64
Base Path: C:\Program Files\dotnet\sdk\3.0.100-preview4-011204\
Host (useful for support):
Version: 3.0.0-preview4-27612-09
Commit: 64e9c3e1cd
作为向简单沙盒应用程序提交此提交的一部分,发现了问题: https :
抄送@pranavkm
对于 preview4,可能的解决方法包括:
1) 有一个中间件,在UseCors()
之后设置HttpContext.Items
的值
```C#
app.UseCors();
app.Use((context, next) =>
{
context.Items["__CorsMiddlewareInvoked"] = true;
返回下一个();
});
2) Disable the check in `EndpointRouting`:
```C#
services.AddRouting(r => r.SuppressCheckForUnhandledSecurityMetadata = true);
第一个将是首选,因为它不会删除对错误配置应用程序的检查。
最有用的评论
对于 preview4,可能的解决方法包括:
1) 有一个中间件,在
UseCors()
之后设置HttpContext.Items
的值```C#
app.UseCors();
app.Use((context, next) =>
{
context.Items["__CorsMiddlewareInvoked"] = true;
返回下一个();
});
第一个将是首选,因为它不会删除对错误配置应用程序的检查。