ASP.NET Web API - 在每个请求之前读取查询字符串/ formdata

时间:2013-02-24 00:27:32

标签: asp.net-mvc-4 asp.net-web-api

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

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

我可以确定我是否应该根据方法读取查询字符串或formdata,当它是GET时,我可以使用Request.GetQueryNameValuePairs()读取查询字符串。但问题是当它是POST时读取formdata。

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

在请求到达请求逻辑之前,从请求中始终如一地非侵入地读取查询字符串和/或表单数据的最合适方法是什么?

3 个答案:

答案 0 :(得分:1)

关于哪个地方会更好的问题,在这种情况下我认为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.

note :请求内容只能单次读取或多次读取的能力取决于主机的缓冲策略。默认情况下,主机的缓冲区策略设置为始终缓冲。在这种情况下,您将能够将位置重置为0.但是,如果您明确地将策略设置为流式传输,则无法重置为0.

答案 1 :(得分:0)

使用ActionFilterAttribute怎么样?

答案 2 :(得分:0)

这段代码对我很有用

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);
}