gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:18:30 25 4
gpt4 key购买 nike

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

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

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

为了满足特定请求,我将请求内容反序列化两次(我有 2 个过滤器)。一旦请求到达 Controller 操作,它就会被 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.
}

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

关于asp.net - 在 Web API 的消息处理程序和操作过滤器中访问实际请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47852320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com