繁体   English   中英

在ASP.Net Core中覆盖415响应

[英]Override 415 response in ASP.Net Core

在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被成功覆盖,但postman仅得到415,没有Json响应。

如果我把:

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

在OnResourceExecuting内而不是OnResourceExecuted内,它按我的意愿工作,但问题是我无法在执行资源之前检查状态代码。

为什么会这样?

你可以试试这个吗?

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触发得太晚了,但是您可以修改自定义消息的主体

我认为使用中间件组件是一个不错的选择。 这是中间件的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);
    }
}

请参阅Microsoft的工作流程:

筛选执行工作流程

IResourceFilter::OnResourceExecuted(ResourceExecutedContext context) 在执行Result之后运行 由于结果执行已经完成,因此您无法更改结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM