10
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 调用它来记录传入的请求。当然可以有多个同时请求。

这种方法可以吗?

4

2 回答 2

8

您的问题是从并发的角度还是一般的 ASP.NET Web API 的角度?每个请求都有自己的上下文,您可以同时处理多个请求。但这里有两件事让你看看。

(1) 由于您使用的是HttpContext,因此您将自己锁定在网络托管 (IIS) 上,这在许多情况下应该没问题。但我希望你能意识到这一点。

HttpRequestHelper.RequestBody()(2)正如您所提到的,当从动作过滤器调用时,您的代码将起作用。但是,如果您尝试从其他地方调用它,比如消息处理程序,这将不起作用。当我说这不起作用时,将请求主体绑定到操作方法参数的参数绑定将不起作用。完成后,您将需要从头开始。它从动作过滤器起作用的原因是,在动作过滤器在管道中运行时已经发生了绑定。这是您可能需要注意的另一件事。

于 2013-09-05T00:21:28.657 回答
0

我需要使用 Http Request 的 InputStream。我有一个导航到 aspx 页面的 WebApp 和 IOS 应用程序,如果 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)

                    {
    ....
于 2013-09-04T22:33:07.060 回答