Не могу поймать HttpMethod: ОПЦИИ на запрос http - PullRequest
0 голосов
/ 20 ноября 2018

Я пишу атрибут 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 в моем фильтре действий?

1 Ответ

0 голосов
/ 20 ноября 2018

Поскольку в приложении настроена CORS, оно отвечает на запрос перед полетом OPTIONS перед MVC.Этот запрос никогда не попадает в MVC, поэтому ваш фильтр не может его увидеть.Ваш фильтр видит запрос GET, следующий за запросом OPTIONS.

app.UseCors(); //Sees OPTIONS request, sets response and returns

app.UseMvc();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...