origin
HTTPリクエストヘッダーが指定されていないCORS対応エンドポイントに対してHTTPリクエストが行われると、リクエストはHTTP500エラーで失敗します。
ログの例外は次のとおりです。
[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()
は、 app.UseEndpoints(...)
前にアプリケーションに追加されています。
これは#9181によって導入されたようです。
リクエストにorigin
リクエストヘッダーがない場合、CORSミドルウェアはスキップされます。
ただし、エンドポイントミドルウェアは、呼び出されているエンドポイントでCORSメタデータを検出し、 HttpContext
のキーを探すことで、CORSミドルウェアが呼び出されたかどうかを確認します(呼び出されたが、不要なためスキップされた)。アイテム。 アイテムが存在しないため、例外がスローされます。
エンドポイントミドルウェアによってテストされているキーは、 origin
ヘッダーがリクエストに存在する場合にのみ追加されます。これは次のとおりです。
2つの可能な修正は次のいずれかであるように思われます。
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 :
cc @pranavkm
Preview4の場合、考えられる回避策は次のとおりです。
1)で値を設定するミドルウェア持つHttpContext.Items
の後にUseCors()
```C#
app.UseCors();
app.Use((context、next)=>
{{
context.Items ["__ CorsMiddlewareInvoked"] = true;
next();を返す
});
2) Disable the check in `EndpointRouting`:
```C#
services.AddRouting(r => r.SuppressCheckForUnhandledSecurityMetadata = true);
最初のものは、誤って構成されたアプリケーションのチェックを削除しないため、推奨されます。
最も参考になるコメント
Preview4の場合、考えられる回避策は次のとおりです。
1)で値を設定するミドルウェア持つ
HttpContext.Items
の後にUseCors()
```C#
app.UseCors();
app.Use((context、next)=>
{{
context.Items ["__ CorsMiddlewareInvoked"] = true;
next();を返す
});
最初のものは、誤って構成されたアプリケーションのチェックを削除しないため、推奨されます。