2013-02-24 82 views
0

对于概述here原因之前,我需要从他们每个请求的查询字符串之前或FORMDATA审查一组值(这样我就可以执行一些验证)。密钥每次都一样,并且应该出现在每个请求中,但是它们将位于GET请求的查询字符串中,以及用于POST和其他数据的查询字符串中的ASP.NET Web API - 读取查询字符串/ FORMDATA每个请求

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

我可以计算出是否应该基于方法读取querystring或formdata,何时它是GET,我可以使用Request.GetQueryNameValuePairs()读取查询字符串OK;然而问题是当它是一个POST时读取formdata。

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

什么是最合适的方式一致和非侵入从请求读取查询字符串和/或FORMDATA它得到请求逻辑之前?

回答

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. 

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

+0

并称作品: - 。 ' \t结果= request.Content.ReadAsFormDataAsync()结果; \t Stream requestStream = request.Content.ReadAsStreamAsync()。Result; \t requestStream.Position = 0; ' 您对缓冲区政策评论...确实认为,从应用的角度来看意味着它不会工作 如果在其上运行代码的服务器具有策略设置为流传? – Aleks 2013-02-24 02:40:04

+1

是的..这是正确的...你可以尝试一下,用本博客文章中提到的Streamed策略代替:http://blogs.msdn.com/b/kiranchalla/archive/2012/09/04/receiving-请求文件或数据功能于流传输模式-AT-A-web的API-service.aspx – 2013-02-24 04:51:04

0

怎么样使用ActionFilterAtrributes?

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); 
} 
相关问题