
[英]Asp.Net core: call a custom method after response is returned from another middleware
[英].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 状态代码。
我可以看到一些用于访问HttpContext
的Response.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.