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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问Web API中的消息处理程序和操作筛选器中的实际请求相关的知识,希望对你有一定的参考价值。

这更像是一个与设计相关的问题,并且非常感谢任何正确方向的帮助/指针。

我正在使用ASP.NET Web API2应用程序,并具有授权过滤器和其他Action过滤器。在这些过滤器中,我需要访问作为HttpPost请求体的一部分的Request对象。我使用以下代码来读取请求正文内容并反序列化为所需的对象。它工作正常。

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

为了满足特定请求,我将请求内容反序列化两次(我有2个过滤器)。一旦请求到达控制器操作,Web API框架就会再次对其进行反序列化。我感到内疚,每次请求被反序列化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.
    }

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

以上是关于访问Web API中的消息处理程序和操作筛选器中的实际请求的主要内容,如果未能解决你的问题,请参考以下文章

什么是“必须处理用户手势才能显示权限请求”。 Chrome Web Serial API 中的错误消息?

MQTT协议

MQTT协议

如何从同一 Azure AD 中的另一个 Web 应用程序访问 Web api?

Web Api 跨域基础认证

chrome 中的 Angularjs 应用程序中的 CORS 错误访问 .NET Web Api