ASP.NET Web API-在每次请求之前读取查询字符串/表单数据



由于这里概述的原因,我需要在每次请求之前查看querystring或formdata中的一组值(这样我就可以执行一些身份验证(。密钥每次都是相同的,并且应该出现在每个请求中,但是它们将位于GET请求的查询字符串中,以及POST和其他的表单数据中

由于这是出于身份验证目的,因此需要在请求之前运行;目前我正在使用MessageHandler。

我可以根据该方法来确定我应该读取querystring还是formdata,当它是GET时,我可以使用Request.GetQueryNameValuePairs((读取querystring OK;然而,问题是在POST时读取表单数据。

我可以使用Request.Content.ReadAsFormDataAsync((获取表单数据,但是表单数据只能读取一次,当我在这里读取时,它不再可用于请求(即我的控制器操作获取空模型(

在请求到达请求逻辑之前,从请求中一致、无干扰地读取querystring和/或formdata的最合适方法是什么?

关于哪个地方更好的问题,在这种情况下,我认为AuthorizationFilters比消息处理程序更好,但无论哪种方式,我都认为问题与多次读取正文有关。

在您的消息处理程序中执行"Request.Content.ReadAsFormDataAsync(("之后,您可以尝试执行以下操作吗?

Stream requestBufferedStream = Request.Content.ReadAsStreamAsync().Result;
requestBufferedStream.Position = 0; //resetting to 0 as ReadAsFormDataAsync might have read the entire stream and position would be at the end of the stream causing no bytes to be read during parameter binding and you are seeing null values.

注意:请求内容只能被读取一次或多次的能力取决于主机的缓冲区策略。默认情况下,主机的缓冲区策略设置为始终缓冲。在这种情况下,您可以将位置重置回0。但是,如果明确将策略设置为"流化",则无法重置回0。

使用ActionFilterAtributes怎么样?

此代码对我的运行良好

public HttpResponseMessage AddEditCheck(Check check)
{
    var request= ((System.Web.HttpContextWrapper)Request.Properties.ToList<KeyValuePair<string, object>>().First().Value).Request;
    var i = request.Form["txtCheckDate"];
    return Request.CreateResponse(HttpStatusCode.Ok);
}

最新更新