【问题标题】:.Net Core Access Response From Custom Middleware Before Serialization序列化前来自自定义中间件的 .Net Core 访问响应
【发布时间】:2021-04-16 21:49:27
【问题描述】:

我正在开发一个自定义中间件,它将根据响应本身设置响应 Http 状态代码。

我有一堂课:

public class Response<T>
{
     public T Data { get; set; }
     
     public IEnumerable<CustomError> Errors { get; set; }
}

由我的 .Net Core API 中的每个控制器返回。

我想创建一个自定义中间件,该中间件将在响应从控制器返回后访问它,它会根据 Errors 字段在响应中分配正确的 Http 状态代码。

我可以看到一些用于访问HttpContextResponse.Body 字段的解决方案,但它会提供一个序列化的字符串,我必须再次反序列化它并且会绕圈子。

.Net Core 有可能吗?

最好的问候, 马辛

【问题讨论】:

    标签: c# asp.net-core .net-core


    【解决方案1】:

    您可以创建一个ActionFilter,而不是中间件,特别是您自己的实现IAsyncResultFilter。在 MVC 上下文中而不是在中间件中转换为 Response 会更容易,因为您可以在那里访问 ObjectResult

    它可能看起来像这样。

    public class Response
    {
        public IEnumerable<string> Errors { get; set; }
    }
    
    public class Response<T> : Response
    {
        public T Data { get; set; }
    }
    

    请注意,我更改了 Response&lt;T&gt; 类以使投射更容易。

    public class ErrorResultFilter : IAsyncResultFilter
    {
        public Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
        {
            var result = context.Result as ObjectResult;
            var response = result?.Value as Response;
            if (response != null)
                context.HttpContext.Response.StatusCode
                    = response.Errors.Any(x => x.Equals("SomeError")) ? 400 : 200;
            return next();
        }
    }
    

    此示例根据"SomeError" 的存在设置状态代码。不涉及序列化/反序列化,只是强制转换。

    services.AddControllers(o => 
    {
        o.Filters.Add(typeof(ErrorResultFilter));
    });
    

    这样,我在startup.cs注册了我的过滤器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 2021-02-10
      • 1970-01-01
      • 2020-02-04
      相关资源
      最近更新 更多