在Web API中访问消息处理程序和操作过滤器中的实际请求



这更多是一个与设计有关的问题,并且在正确方向上的任何帮助/指示都得到高度赞赏。

我正在处理ASP.NET Web API2应用程序,并具有授权过滤器和其他操作过滤器。在这些过滤器中,我需要访问作为HTTPPOST请求主体一部分的请求对象。我使用以下代码读取请求主体内容,并将其划分到所需的对象中。它可以正常工作。

//actionContext is HttpActionContext
var requestContent = actionContext.Request.Content.ReadAsStringAsync();
var request = JsonSerializer.GetObject<BaseOTARequestModel>(requestContent.Result);

为了满足特定的请求,我对请求内容进行了两次(我有2个过滤器)的要求。一旦请求达到控制器操作,Web API框架再次将其重新序列化。我感到内gui,每个请求都被审理了3次,并且感觉有一种更好的方法来处理这一点。

如何避免在请求中多次挑选请求?

我将其作为一个挑战,并提出了这个解决方案。这是一个基本过滤器属性类:

public abstract class BaseOTARequestFilterAttribute : ActionFilterAttribute
{
    private HttpActionContext _actionContext;
    protected BaseOTARequestModel RequestModel
    {
        get
        {
            if (_actionContext.Request.Properties.ContainsKey("RequestModel"))
            {
                return _actionContext.Request.Properties["RequestModel"] as BaseOTARequestModel;
            }
            return null;
        }
        set
        {
            _actionContext.Request.Properties["RequestModel"] = value;
        }
    }
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        _actionContext = actionContext;
        if (RequestModel == null)
        {
            //actionContext is HttpActionContext
            var requestContent = actionContext.Request.Content.ReadAsStringAsync();
            RequestModel = JsonSerializer.GetObject<BaseOTARequestModel>(requestContent.Result);
        }
    }
}

此基类处理您的避难所,并使用Request.Properties集合来存储它。(好吧,我知道Web API是无状态的,但是此状态仅在请求执行期间才存在。)

您的各种属性都应继承此基类,并且可以使用贬值的对象如下:

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        base.OnActionExecuting(actionContext);
        var data = RequestModel;
        // etc.
    }

这可能不是最优雅的解决方案,但我相信它有效。有兴趣听到他人的观点。

最新更新