c# - 覆盖 ASP.Net Core 中的 415 响应

标签 c# 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 触发得太晚了,但您可以修改自定义消息的正文

关于c# - 覆盖 ASP.Net Core 中的 415 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53166761/

相关文章:

c# - 如何在 ASP.NET Core 中设置 Automapper

c# - Windows Phone 8 Geolocator 缓存位置

c# - 代码内部包含的用户和密码

c# - 带有 VS 2015 的 RESTful Web 服务

asp.net-core - 执行脚手架dbcontext时如何使集合复数?

c# - 为什么 EF Core 更新无法更新已修改的列

c# - 具有依赖注入(inject)的 EF core DbContext

c# - 拥有一次性字段的类型应该是一次性的。如何解决这个警告?

c# - 如何保护 Web API 上的 Controller 仅供本地计算机使用

c# - 登录 ASP.NET Core 3.1 后如何获取用户信息