Отменить ответ 415 в ASP.Net Core - PullRequest
0 голосов
/ 06 ноября 2018

В ASP.net Core 2.1 я хочу вернуть ответ Json вместе с кодом состояния 415 вместо 415, возвращенного по умолчанию.

Для этого я использую фильтр ресурсов:

public class MediaTypeResouceFilter : Attribute, IResourceFilter
{
    public void OnResourceExecuting(ResourceExecutingContext context)
    {
    }

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        if (context.HttpContext.Response.StatusCode == 415)
        {
            context.Result = new ContentResult() { StatusCode = 415, Content = JsonConvert.SerializeObject(myResponse), ContentType = "application/json" };
        }
    }
}

В отладке я вижу, что context.Result успешно переопределяется, но почтальон получает только 415 без ответа Json.

Если я поставлю:

context.Result = new ContentResult() { StatusCode = 415, Content = JsonConvert.SerializeObject(myResponse), ContentType = "application/json" };

внутри OnResourceExecuting вместо OnResourceExecuted, он работает, как я хочу, но дело в том, что я не могу проверить код состояния перед выполнением ресурса.

Есть идеи, почему это происходит?

Ответы [ 3 ]

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

вы можете попробовать это?

public class MediaTypeResouceFilter : Attribute, IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
        }

        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            if (context.HttpContext.Response.StatusCode == 415)
            {
                var jsonString = JsonConvert.SerializeObject(new { data = "this is custom message" });
                byte[] data = Encoding.UTF8.GetBytes(jsonString);
                context.HttpContext.Response.Body.WriteAsync(data, 0, data.Length);
            }
        }
    }

Тогда вы можете получить код состояния 415 и данные тела: {"data":"this is custom message"}

На самом деле OnResourceExecuted срабатывает слишком поздно, но вы можете изменить тело для своего пользовательского сообщения

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

Я думаю, что использование компонента промежуточного программного обеспечения - хороший выбор. Это метод Invoke промежуточного программного обеспечения:

public async Task Invoke(HttpContext context) {
    Exception exception = null;
    try {
        await _next(context);
    }
    catch (Exception e) {
        exception = e;
        //try handling exception stuff...
    }

    //try handling 415 code stuff...
    if(context.Response.StatusCode==415){
        var yourJsonObj = new { Blah = "blah..." };
        string result = JsonConvert.SerializeObject(yourJsonObj);
        //context.Response.StatusCode = 200; //You can change the StatusCode here
        context.Response.ContentType = "application/json";
        await context.Response.WriteAsync(result);
    }
}
0 голосов
/ 06 ноября 2018

См. Рабочий процесс Microsoft :

filter execution workflow

Метод IResourceFilter::OnResourceExecuted(ResourceExecutedContext context) запускается после выполнения Result . Поскольку выполнение результата уже завершено, вы не можете вносить изменения в результат.

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