访问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 中的错误消息?