C#中大字节数组转Stream数据截断,maxAllowedSize用法咨询
问题解决:字节数组转Stream后大文件数据截断
首先明确:MemoryStream本身不存在默认500kb的大小限制,直接用new MemoryStream(rawData)包装字节数组,只要数组本身数据完整,Stream就会包含全部数据。你提到的maxAllowedSize参数,一般是ASP.NET Core中处理请求体时的配置项,而非MemoryStream的参数。
排查方向与解决步骤
1. 确认原始字节数组是否完整
先检查你的rawData数组本身是否真的包含了全部数据——如果数组在生成/获取时就已经被截断,那转成Stream自然也会丢数据。可以通过打印rawData.Length来验证实际大小。
2. 若后续在ASP.NET Core中使用Stream时遇到限制
如果是在读取请求体(比如将Request.Body转成Stream处理)时触发的500kb限制,才需要用到maxAllowedSize。例如在使用Request.ReadFromJsonAsync或MultipartReader时,可以通过配置参数调整限制:
示例1:读取JSON时设置最大允许大小
var options = new JsonOptions { MaxDepth = 32, // 设置你需要的最大大小,单位是字节,比如设置为10MB MaxAllowedSize = 10 * 1024 * 1024 }; var model = await Request.ReadFromJsonAsync<YourModel>(options);
示例2:全局配置请求体大小限制
在Program.cs中全局设置,避免每个地方单独配置:
builder.Services.Configure<JsonOptions>(options => { options.MaxAllowedSize = 10 * 1024 * 1024; // 10MB }); // 或者针对表单/多部分数据的全局配置 builder.Services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 10 * 1024 * 1024; });
3. 检查Stream读取方式是否正确
如果是你自己读取MemoryStream时出现截断,要确保读取逻辑正确:
- 读取前先将
Stream.Position重置为0(如果之前读过的话) - 使用
stream.ReadToEndAsync()或完整的循环读取,避免只读取一次就停止
示例正确读取方式:
// 重置位置到开头 binstream.Position = 0; using var reader = new StreamReader(binstream); string content = await reader.ReadToEndAsync(); // 或者读取字节 binstream.Position = 0; byte[] buffer = new byte[binstream.Length]; await binstream.ReadAsync(buffer, 0, buffer.Length);
内容的提问来源于stack exchange,提问作者ricky5panish99
相关产品推荐
相关产品推荐

