0

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

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

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

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

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

4

3 回答 3

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。

于 2013-02-24T00:41:34.350 回答
0

What about using ActionFilterAtrributes?

于 2013-02-24T00:54:42.073 回答
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);
}
于 2015-07-06T14:39:43.320 回答