Asp.Net Core 3.0 CreatedAtAction не возвращает маршрут, соответствующий предоставленным значениям, когда имя действия заканчивается на Async

У меня была странная проблема с CreatedAtAction: если имя моего метода оканчивается ключевым словом «Async», я получаю ошибку 500 «ни один маршрут не соответствует предоставленным значениям», когда я возвращаю CreatedAtAction из моего метода Add. Если я добавлю что-нибудь еще в качестве имени метода, например GetRatePlanAs, GetRatePlanAsyncA или GetRatePlan, тогда это будет работать как шарм.

Также будет работать, если я добавлю [ActionName ("GetRatePlanAsync")], но я не хотел этого делать.

CreatedAtAction:

return CreatedAtAction(nameof(GetRatePlanAsync), new { ... }, null);

Не работает:

    [HttpGet]
    [Route("item")]
    public async Task<ActionResult> GetRatePlanAsync(...)

Работает:

    [HttpGet]
    [Route("item")]
    [ActionName("GetRatePlanAsync")]
    public async Task<ActionResult> GetRatePlanAsync(...)

Также работают:

    [HttpGet]
    [Route("item")]
    public async Task<ActionResult> GetRatePlan(...)

person Nemanja Todorovic    schedule 11.12.2019    source источник


Ответы (1)


После нескольких часов тестирования и прочего я нашел эти статьи: https://github.com/aspnet/AspNetCore/issues/15316 и https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#async-suffix-remove-from-controller-action-names

Короче говоря, это критическое изменение в Asp.Net Core 3.0.

Одно из решений, которое мне действительно понравилось, заключалось в том, чтобы установить для options.SuppressAsyncSuffixInActionNames значение false в Configure Services Startup:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers(options => options.SuppressAsyncSuffixInActionNames = false);

        ...
    }
person Nemanja Todorovic    schedule 11.12.2019
comment
Странная ошибка / поведение ... Да, если оставить суффикс Async выключенным, или аннотация [ActionName("MyActionNameAsync")] работает (как сказал OP). Или использование options.SuppressAsyncSuffixInActionNames в Startup.cs также работает (обходной путь, предоставленный Неманей). Спасибо вам обоим! - person JohnB; 21.01.2020