4

我正在开发一个 ASP.NET 4.5 应用程序,但遇到了一个非常烦人的问题。迁移到 VS2012 后,我们遇到了与此处相同的问题。给定的解决方案有效,但是我现在发现正在发生另一个问题。由于某种原因,包含 HTTP 请求正文内容的 InputStream 被报告为空。Content-Length 标头声称存在数据,但我无法访问它。

奇怪的是,数据似乎存在于上述链接问题中指定的解决方法模块中,但在模块和 API 调用之间的某个时刻,流被一个空的替换。请参见以下示例:

public class WcfReadEntityBodyModeWorkaroundModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += context_BeginRequest;
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        //This will force the HttpContext.Request.ReadEntityBody to be "Classic" and will ensure compatibility..

        Stream stream = app.Request.InputStream;
        // This stream has data...
    }
} 

...

    [OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Xml)]
    public Dictionary<string,string> SaveAudioFile()
    {
        Stream s = HttpContext.Current.Request.InputStream;
        // ...but this one does not. Request.ContentLength is nonzero, but
        // the InputStream.Length property is zero.
        ...
    }

从配置中删除模块只会在访问流时导致异常,就像以前一样。

有任何想法吗?

4

3 回答 3

9

在其他答案中找到了这个:

Request.InputStream.Position = 0;
于 2013-11-18T13:32:57.763 回答
0

我一直在围绕这样的问题。我解决了,我的代码在这里发布 Read Request Body in ASP.NET

于 2015-01-07T12:07:01.043 回答
0

当我第二次尝试从 Request InputStream 读取流时,这发生在我身上。Request.InputStream.Position = 0; 解决了肖恩提到的我的问题。

于 2020-03-25T02:27:14.667 回答