我们有一个公共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
当传递的正文是有效的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()
,它将重置流,我将能够继续。我用来做这件事的代码行是在代码示例中看到的注释掉的行。
在更仔细的检查之前,这似乎是有效的。放在bodyText
中的ReadToEnd()
结果似乎在中间被截断了,而不是读到最后。我注意到的一个有趣的细节是它在长度1024处停止。换句话说,ReadToEnd()
只返回前1024个字符。当然,1024对我来说是一个非常可疑的数字,但我对StreamReaders缺乏了解,这让我止步不前。
现在的主要问题是:为什么在调用ReadToEnd()
时,本例中的StreamReader只返回前1024个字符?同样,这似乎只有在发送的JSON格式不正确时才会发生。
此外,如果有人想出一种更简单的方法来获取请求的原始正文,我也愿意尝试一下。提前谢谢。
编辑:我尝试使用HttpContext.Current.Request.GetBufferlessInputStream(disableMaxRequestLength:true)
查看结果。收到的错误提到在已经调用GetBufferedInputStream
之后无法使用GetBufferlessInputStream
。
发布于 2021-02-06 01:52:25
我也有同样的问题,我很惊讶我不能很快找到这个答案。以下是对我有效的方法:
using (var reader = new StreamReader(streamAFLPem, System.Text.Encoding.Default, false, 2048))
{
//Process StreamReader
}
我在MS网站上找到了这个。您可能需要调整设置,但它可以让您增加缓冲区大小。
https://stackoverflow.com/questions/56484080
复制相似问题