StreamReader的API请求正文被截断为1024个字符

时间:2019-06-06 19:38:29

标签: c# asp.net-web-api2 streamreader

我们有一个公共API调用,我们希望获取请求正文的原始内容并将其存储在数据库的日志记录中。我们的代码的基本用法如下:

public HttpResponseMessage PutObjects([FromBody] List<ObjectDTO> objectsDto)
{
    string bodyText = "";
    //HttpContext.Current.Request.GetBufferedInputStream().Close();
    using (var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream))
    {
        bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
        bodyText = bodyStream.ReadToEnd();
    }
    // ... Rest of logic proceeds

当所传递的Body具有有效的JSON以反序列化为objectsDto时,可以使用此解决方案。但是,当JSON格式错误且无法加载到objectsDto参数中时,将引发以下错误:

System.InvalidOperationException: 'Either BinaryRead, Form, Files, or InputStream was accessed before the internal storage was filled by the caller of HttpRequest.GetBufferedInputStream.'

我曾想过,如果是因为(假设)自动调用GetBufferedInputStream而导致参数未填充,那么如果我对此执行Close(),它将重置流,我将能够继续。我用于执行此操作的代码行是在代码示例中看到的注释行。

在仔细检查之前,这似乎一直有效。放入ReadToEnd()的{​​{1}}结果似乎在中间被截断,而不是读到末尾。我注意到的一个有趣的细节是,它的长度为1024,即从bodyText返回的前1024个字符。当然,对我来说1024是一个非常可疑的数字,但是我对StreamReaders的了解不足使我处于停滞状态。

现在的主要问题是:为什么在这种情况下,StreamReader在调用ReadToEnd()时仅返回前1024个字符?同样,这似乎仅在发送的JSON格式不正确的情况下发生。

此外,如果有人想到一种更简单的方法来获取请求的原始正文,我也愿意尝试。预先感谢。

编辑:我试图使用ReadToEnd()来查看结果。收到的错误提到已经调用HttpContext.Current.Request.GetBufferlessInputStream(disableMaxRequestLength:true)后无法使用GetBufferlessInputStream

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,很惊讶我无法快速找到这个答案。以下是对我有用的方法:

using (var reader = new StreamReader(streamAFLPem, System.Text.Encoding.Default, false, 2048))
    {
         //Process StreamReader
    }

我在 MS 网站上找到了这个。您可能需要调整设置,但它可以让您增加缓冲区大小。 enter image description here