ASP.Net Core 2.0. Как вернуть пользовательский ответ json или xml из промежуточного программного обеспечения?

В ASP.Net Core 2.0 я пытаюсь вернуть сообщение в формате json или xml с кодом состояния. У меня нет проблем с возвратом пользовательского сообщения из контроллера, но я не знаю, как с этим справиться в промежуточном программном обеспечении.

Мой класс промежуточного программного обеспечения пока выглядит так:

public class HeaderValidation
{
    private readonly RequestDelegate _next;
    public HeaderValidation(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        // How to return a json or xml formatted custom message with a http status code?

        await _next.Invoke(httpContext);
    }
}

person philipp-fx    schedule 15.03.2018    source источник
comment
Пожалуйста, разместите свой вопрос о заголовках как отдельный question на SO.   -  person Set    schedule 15.03.2018


Ответы (1)


Чтобы заполнить ответ в промежуточном программном обеспечении, используйте свойство httpContext.Response, которое возвращает объект HttpResponse для этого запроса. В следующем коде показано, как вернуть ответ 500 с содержимым JSON:

public async Task Invoke(HttpContext httpContext)
{
    if (<condition>)
    {
       context.Response.StatusCode = 500;  

       context.Response.ContentType = "application/json";

       string jsonString = JsonConvert.SerializeObject(<your DTO class>);

       await context.Response.WriteAsync(jsonString, Encoding.UTF8);

       // to stop futher pipeline execution 
       return;
    }

    await _next.Invoke(httpContext);
}
person Set    schedule 15.03.2018
comment
Спасибо за решение Set, очень полезно! Есть ли возможность динамически возвращать json или xml без оператора if(...)? Я зарегистрировал XmlDataContractSerializerOutputFormatter, но это только в рамках services.AddMvc(...) - person philipp-fx; 15.03.2018
comment
@philipp-fx Я добавил if только для того, чтобы подчеркнуть, что промежуточное ПО может возвращать результат или вызывать следующее промежуточное ПО в конвейере. Что касается динамического форматирования ответа, я точно не знаю, но предполагаю, что лучший способ — вручную выбрать Response.ContentType на основе HTTP-заголовка запроса Accept. Для формата XML это будет application/xml. - person Set; 15.03.2018
comment
Спасибо, Сет, я понимаю ваше if (<condition>), и я имею в виду не if утверждение. В вашем коде возвращается json. Принимая во внимание xml, очевидно добавить оператор if и работать через json и xml в зависимости от заголовка. Однако я предпочитаю меньше строк кода и избегаю такого рода операторов if. Можно ли обратиться к принятому типу мультимедиа json, xml или любому другому в более глобальном масштабе? - person philipp-fx; 16.03.2018