public static class HttpRequestHelper
{
public static string RequestBody()
{
var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream);
bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
var bodyText = bodyStream.ReadToEnd();
return bodyText;
}
}
我打算从ActionFilters中调用它来记录传入的请求。当然可能有多个同时发出的请求。
这种方法可以吗?
答案 0 :(得分:6)
您的问题是从并发性还是ASP.NET Web API的角度来看的?每个请求都有自己的上下文,您可以并行处理多个请求。但是你有两件事要看。
(1)由于您使用的是HttpContext
,因此您将自己锁定到Web托管(IIS),这在很多情况下应该没问题。但我希望你能意识到这一点。
(2)正如您所提到的,当您从动作过滤器调用时,您的代码HttpRequestHelper.RequestBody()
将起作用。但是,如果你试图从其他地方调用它,比如说一个消息处理程序,这将不起作用。当我说这不起作用时,将请求体绑定到操作方法参数的参数绑定将不起作用。一旦完成,你将需要寻求开始。它从动作过滤器起作用的原因是动作过滤器在管道中运行时已经发生了绑定。这是您可能需要注意的另一件事。
答案 1 :(得分:0)
我需要使用Http Request的InputStream。我有一个WebApp和IOS应用程序导航到一个aspx页面,如果url请求包含一些参数我读取数据库中的信息,如果我没有在url请求中找到任何参数我读取请求正文,我工作正常!
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (string.IsNullOrEmpty(Request.QueryString["AdHoc"]) == false)
{
string v_AdHocParam = Request.QueryString["AdHoc"];
string [] v_ListParam = v_AdHocParam.Split(new char[] {','});
if (v_ListParam.Length < 2)
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(WS_DemandeIntervention));
WS_DemandeIntervention response = (WS_DemandeIntervention)jsonSerializer.ReadObject(Request.InputStream);
....
}
if (string.IsNullOrEmpty(Request.QueryString["IdBonDeCommande"])==false)
{
....