Я пишу атрибут ActionFilterAttribute, в котором я проверяю параметры маршрута / запроса userId и сравниваю их с предметом токена jwt.Я заметил, что мой фильтр действий срабатывает дважды.В Chrome я вижу, что запрос OPTIONS отправляется на сервер, и в выводе моей консоли отладки я вижу вызов с правильным методом http:
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 OPTIONS http://localhost:5000/api/v1/users/33417
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:5000/api/v1/users/33417 application/json
Но когда он попадает в мой фильтр действий, метод Httpвсегда устанавливается как GET, поэтому я не могу вернуть свой фильтр при вызове OPTIONS.
Вот основной метод переопределения OnActionExecutionAsync:
public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
Debug.WriteLine("URL CALL: " + context.HttpContext.Request.GetDisplayUrl());
Debug.WriteLine("HTTP METHOD: " + context.HttpContext.Request.Method);
if (HttpMethods.IsOptions(context.HttpContext.Request.Method))
{
Debug.WriteLine("HTTP METHOD: OPTIONS");
return base.OnActionExecutionAsync(context, next);
}
// Other Code ....
}
Журнал отладки:
URL CALL: http://localhost:5000/api/v1/users/33417
HTTP METHOD: GET
URL CALL: http://localhost:5000/api/v1/users/33417
HTTP METHOD: GET
Еще один интересный момент: если я запрашиваю OPTIONS из инструмента Postman, мой APIвозвращает это сообщение об ошибке:
{
"error": {
"code": "UnsupportedApiVersion",
"message": "The HTTP resource that matches the request URI 'http://localhost:5000/api/v1/users/33417' with API version '1' does not support HTTP method 'OPTIONS'.",
"innerError": null
}
}
Вот моя конфигурация Cors при запуске:
services.AddCors(options => options.AddPolicy(_constants.CorsPolicy,
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
.Build()));
Можно ли как-нибудь перехватить http-метод OPTIONS в моем фильтре действий?