Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Core 2.2 MVC:包装响应_C#_Asp.net Core Mvc - Fatal编程技术网

C# ASP.NET Core 2.2 MVC:包装响应

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控制器而不是视图控制器进行包装 据我所知,有两种选择:中间件或操作过滤器 起初我认为中间件是最好的选择,但后来我意识到我仍然需要弄清楚正在处理的是哪种请求,这会增加维护方面的潜在麻烦 然后我

我有一个在ASP.NET核心MVC中开发的应用程序,其中包含一组用于正常视图响应和Web API的控制器

我试图找到一种正确的方法,用一个一致的类来包装所有Web API响应

我的第一个问题是,包装来自Web API控制器的响应的正确方法是什么。由于我有两种控制器类型,我需要区分它们,因为响应应该只针对API控制器而不是视图控制器进行包装

据我所知,有两种选择:中间件或操作过滤器

起初我认为中间件是最好的选择,但后来我意识到我仍然需要弄清楚正在处理的是哪种请求,这会增加维护方面的潜在麻烦

然后我看了一个动作过滤器,似乎插入包装处理是一个更好的选择

例如,可以只为Web 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)
    { }
}

有道理,非常感谢!将查看结果过滤器。