【问题标题】:ASP.NET Core 2.2 MVC : wrap responsesASP.NET Core 2.2 MVC:包装响应
【发布时间】:2019-09-15 13:36:26
【问题描述】:

我有一个用 ASP.NET Core MVC 开发的应用程序,其中包含一组用于普通视图响应和 Web API 的控制器。

我正在尝试找到一种正确的方法来使用一致的类来包装所有 Web API 响应。

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

据我了解,中间件或动作过滤器有两种选择。

起初我认为中间件是最好的选择,但后来我意识到我仍然需要弄清楚正在处理什么样的请求,这会给维护带来更多潜在的麻烦?

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

例如,可以将操作过滤器添加到仅用于 Web API 的基本控制器,而不是处理视图的控制器。

所以问题是动作过滤器是否是实现这一目标的最佳方法?

【问题讨论】:

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


    【解决方案1】:

    我建议您查看result filters。结果过滤器在控制器操作产生结果后运行,它允许您查看该结果然后执行一些操作。

    例如,当您在控制器操作中返回 View 时,返回的是 ViewResult,这样可以轻松识别会导致呈现 Razor 视图的结果。

    在 API 控制器中,您通常会返回 ActionResult<T>、直接返回某个模型对象或 ObjectResult。执行操作时,前两个将自动转换为ObjectResult。因此,您可以只查找ObjectResults,然后将结果更改为具有一些包装对象。这看起来像这样:

    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)
        { }
    }
    

    【讨论】:

    • 有道理,非常感谢!将查看结果过滤器。
    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多