这是获取 HttpContext 请求正文的安全方法吗?


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

这种方法可以吗?

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

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

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

我需要使用Cookie请求的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)
                    {
    ....

最新更新