Microsoft Graph 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
相关产品推荐
相关产品推荐

