You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Microsoft Graph 5.38获取SharePoint文件内容时Length属性报错求助

解决方案:.NET7 + Graph API 5.38获取SharePoint文件流时Length属性报错

这个问题不是Graph API的Bug,是因为5.x版本的Graph SDK返回的是只进式网络响应流(HttpBaseStream),这类流本身就不支持Length属性——原因是HTTP响应可能采用分块传输,服务器没有提前返回Content-Length头,.NET的HttpClient默认不会为这类流提供Length值,访问就会抛出NotSupportedException。

给你几个可行的解决办法:

1. 转存到内存流获取完整属性

如果需要操作流的Length或者随机访问,把响应流复制到MemoryStream即可:

using var fileContent = await _graphServiceClient.Drives[docFolderId].Items[file.Id].Content.GetAsync();
using var memoryStream = new MemoryStream();
await fileContent.CopyToAsync(memoryStream);

// 现在可以正常访问Length,重置指针后还能重复读取
memoryStream.Position = 0;
long fileLength = memoryStream.Length;

2. 直接读取内容(无需Length)

如果只是要读取文件内容,不用转存,直接用流读取即可:

// 文本文件读取
using var fileContent = await _graphServiceClient.Drives[docFolderId].Items[file.Id].Content.GetAsync();
using var reader = new StreamReader(fileContent);
string fileText = await reader.ReadToEndAsync();

// 二进制文件读取
using var fileContent = await _graphServiceClient.Drives[docFolderId].Items[file.Id].Content.GetAsync();
using var ms = new MemoryStream();
await fileContent.CopyToAsync(ms);
byte[] fileBytes = ms.ToArray();

3. 提前获取文件大小属性

如果只是需要文件的大小数值,不用从流里取,直接先获取SharePoint文件的size属性更高效:

var fileMetadata = await _graphServiceClient.Drives[docFolderId].Items[file.Id]
    .Select("size")
    .GetAsync();
long fileSize = fileMetadata.Size.Value;

内容的提问来源于stack exchange,提问作者Andrew Casey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:02:06