我有一个.NET Framework API托管在Azure上。我在这个API上有一个POST端点,通过主体接收一些数据(json内容,utf-8编码(。大多数请求都是成功的,但是,有时我会得到NullReferenceException
,因为我的模型是null
。
我正在记录该端点上的请求信息,我得到了:
- 成功请求和不成功请求的请求内容长度相同
- 当正文为
null
时,内容字节都是零。因此,这并不是说主体丢失了:它在那里,但不知何故,请求字节数组的所有位置都被转换为零
此外,通过在我的一端使用Fiddler,我知道我在任何时候都能正确发送身体。
这真的很奇怪。
有什么想法吗?
编辑:我无法在本地主机或本地IIS上重现这种行为,只能在Azure上重现。
编辑:我们有一个扩展方法来读取请求信息:
public static string GetBody(this HttpRequest request)
{
using (var stream = new MemoryStream())
{
request.InputStream.Position = 0;
request.InputStream.CopyTo(stream);
request.InputStream.Position = 0;
stream.Position = 0;
var bytes = stream.ToArray();
stream.Position = 0;
return $"{Encoding.UTF8.GetString(bytes).Replace(Environment.NewLine, "").Replace(" ", "")} | RequestLength: {request.InputStream.Length} | ArrayLength: {bytes.Length} | Array: {string.Join(" ", bytes)}";
}
}
您可以使用请求.InputStream.CanRead和要求.InputStream.CanSeek,这样您就可以安全地在流中重新定位光标,然后再读取它。
直接从请求中读取。重新读取时,InputStream将返回null,即使存在数据。
请参阅此处了解更多信息