C# ASP.NET Core 2.2 MVC:包装响应
我有一个在ASP.NET核心MVC中开发的应用程序,其中包含一组用于正常视图响应和Web API的控制器 我试图找到一种正确的方法,用一个一致的类来包装所有Web API响应 我的第一个问题是,包装来自Web API控制器的响应的正确方法是什么。由于我有两种控制器类型,我需要区分它们,因为响应应该只针对API控制器而不是视图控制器进行包装 据我所知,有两种选择:中间件或操作过滤器 起初我认为中间件是最好的选择,但后来我意识到我仍然需要弄清楚正在处理的是哪种请求,这会增加维护方面的潜在麻烦 然后我看了一个动作过滤器,似乎插入包装处理是一个更好的选择 例如,可以只为Web API而不是处理视图的控制器向基本控制器添加操作过滤器C# ASP.NET Core 2.2 MVC:包装响应,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,我有一个在ASP.NET核心MVC中开发的应用程序,其中包含一组用于正常视图响应和Web API的控制器 我试图找到一种正确的方法,用一个一致的类来包装所有Web API响应 我的第一个问题是,包装来自Web API控制器的响应的正确方法是什么。由于我有两种控制器类型,我需要区分它们,因为响应应该只针对API控制器而不是视图控制器进行包装 据我所知,有两种选择:中间件或操作过滤器 起初我认为中间件是最好的选择,但后来我意识到我仍然需要弄清楚正在处理的是哪种请求,这会增加维护方面的潜在麻烦 然后我
所以问题是动作过滤器是否是实现这一点的最佳方法 我建议你看看这个。结果过滤器在控制器操作产生结果后运行,它允许您查看该结果,然后执行某些操作 例如,当您在控制器操作中返回
视图
时,返回的是一个属性,它可以很容易地识别将导致呈现Razor视图的结果
在API控制器中,通常会直接返回一个、某个模型对象或一个。在执行操作时,前两个将自动转换为ObjectResult
。因此,您可以只查找ObjectResult
s,然后将结果改为使用一些包装器对象。这看起来像这样:
public class WrapApiResponseResultFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{
var result = context.Result;
if (result is ObjectResult)
{
// wrap the inner object
var newValue = new WrapperObject(result.Value);
// replace the result
context.Result = new ObjectResult(newValue)
{
// copy the status code
StatusCode = result.StatusCode,
};
}
}
public void OnResultExecuted(ResultExecutedContext context)
{ }
}
有道理,非常感谢!将查看结果过滤器。