首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自StreamReader的接口请求体被截断为1024个字符

来自StreamReader的接口请求体被截断为1024个字符
EN

Stack Overflow用户
提问于 2019-06-07 03:38:29
回答 1查看 510关注 0票数 2

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

代码语言:javascript
运行
复制
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

当传递的正文是有效的JSON,可以反序列化到objectsDto中时,使用这种解决方案是可行的。但是,当JSON格式错误且无法加载到objectsDto参数中时,将抛出以下错误:

代码语言:javascript
运行
复制
System.InvalidOperationException: 'Either BinaryRead, Form, Files, or InputStream was accessed before the internal storage was filled by the caller of HttpRequest.GetBufferedInputStream.'

我有一个想法,如果是因为(我假设)对GetBufferedInputStream的自动调用而没有填充参数,那么如果我对此执行Close(),它将重置流,我将能够继续。我用来做这件事的代码行是在代码示例中看到的注释掉的行。

在更仔细的检查之前,这似乎是有效的。放在bodyText中的ReadToEnd()结果似乎在中间被截断了,而不是读到最后。我注意到的一个有趣的细节是它在长度1024处停止。换句话说,ReadToEnd()只返回前1024个字符。当然,1024对我来说是一个非常可疑的数字,但我对StreamReaders缺乏了解,这让我止步不前。

现在的主要问题是:为什么在调用ReadToEnd()时,本例中的StreamReader只返回前1024个字符?同样,这似乎只有在发送的JSON格式不正确时才会发生。

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

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

EN

回答 1

Stack Overflow用户

发布于 2021-02-06 01:52:25

我也有同样的问题,我很惊讶我不能很快找到这个答案。以下是对我有效的方法:

代码语言:javascript
运行
复制
using (var reader = new StreamReader(streamAFLPem, System.Text.Encoding.Default, false, 2048))
    {
         //Process StreamReader
    }

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56484080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档