ASP.Net Core 2.0 - 如何从中间件返回自定义的json或xml响应?

6
在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);
    }
}

1
请在 SO 上将关于头文件的问题作为一个单独的“问题”发布。 - Set
1个回答

21

在中间件中填充响应,使用 httpContext.Response 属性,它会返回此请求的 HttpResponse 对象。以下代码演示如何返回带有 JSON 内容的 500 响应:

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);
}

感谢Set提供的解决方案,非常有帮助!是否有可能在没有if(...)语句的情况下动态返回json或xml?我注册了一个XmlDataContractSerializerOutputFormatter,但它只在services.AddMvc(...)的范围内。 - philipp-fx
@philipp-fx 我只是添加了一个 if 来强调中间件可以返回结果或调用管道中的下一个中间件。关于动态响应格式,我不确定,但认为最好的方法是根据请求的HTTP头部Accept手动选择Response.ContentType。对于XML格式,它将是 application/xml - Set
谢谢Set,我理解你的 if (<condition>),但我指的不是 if 语句。在你的代码中,返回了一个 JSON。考虑到 XML,很明显需要添加一个 if 语句,并根据头部处理 JSON 和 XML。然而,我更喜欢少写几行代码,避免这种 if 语句。有没有可能在更全局的范围内处理接受的媒体类型 JSON、XML 或其他类型? - philipp-fx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接