这是获取HttpContext请求体的安全方式吗?

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

这种方法可行吗?

2个回答

8
你的问题是从并发或ASP.NET Web API的一般角度来看的吗?每个请求都有自己的上下文,而且您可以同时处理多个请求。但是这里有两件事情需要注意。
(1) 由于您正在使用HttpContext,因此您正在将自己锁定到Web托管(IIS),在许多情况下应该是可以的。但我希望您知道这一点。
(2) 当你从一个操作过滤器中调用代码HttpRequestHelper.RequestBody()时,它会起作用,正如你所提到的那样。但是,如果您尝试从其他地方调用它,比如消息处理程序,这将不起作用。当我说这将不起作用时,绑定请求体到操作方法参数的参数绑定将不起作用。你需要在完成后寻求开头。之所以从操作过滤器中起作用是因为绑定已经发生在操作过滤器运行的管道中。这是另一件您可能需要注意的事情。

1
Re.(2) 我是否应该在 var bodyText = bodyStream.ReadToEnd(); 后添加 bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);? - tom
Re.(1) 感谢您指出这一点;在可预见的未来,我将在IIS上进行托管。 - tom
是的,你可以寻找开头以更安全的方式进行。 - Badri
1
Rest Sharp和我自己会这样做。var test = HttpContext.Request.InputStream; var sr = new StreamReader(test);var body = sr.ReadToEnd();var test2 = SimpleJson.DeserializeObject<dynamic>(body); - Netferret

0
我需要使用Http请求的InputStream。我有一个WebApp和IOS App,它们导航到一个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)

                    {
    ....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接