繁体   English   中英

序列化前来自自定义中间件的 .Net Core 访问响应

[英].Net Core Access Response From Custom Middleware Before Serialization

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

我有一个 class:

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

这是由 my.Net Core API 中的每个 controller 返回的。

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

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

.Net Core 有可能吗?

最好的问候, 马辛

代替中间件,您可以创建一个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<T> class 以使投射更容易。

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中注册了我的过滤器

暂无
暂无

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

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