使用MS Graph读取SharePoint中Docx文件时遇“流不支持超时”错误求助
核心问题定位
- 二进制文件处理错误:Word文档(尤其是
.docx)本质是ZIP压缩包格式的二进制文件,你用StreamReader读取后转成ASCII字符串再转回字节数组的过程,会直接破坏原始二进制数据结构,导致Open XML SDK无法识别文件,进而触发“文件损坏”提示。 - MemoryStream超时异常:
MemoryStream本身不支持超时属性,Open XML SDK内部尝试访问ReadTimeout时会引发调试层面的异常提示,但这不是文件损坏的根本原因,根源还是字节数据已被破坏。
修复方案
1. 修正Graph文件读取逻辑
直接从Graph返回的Stream读取原始字节,跳过字符串转换步骤,避免破坏二进制数据:
var graphClient = new GraphServiceClient(clientSecretCredential, scopes, "https://graph.microsoft.com/v1.0"); try { string x = ""; foreach (var doc in documentsToRead) { using (var stream = await graphClient.Drives[$"{doc.DriveId}"].Items[$"{doc.ItemId}"].Content.GetAsync()) { using (var memoryStream = new MemoryStream()) { await stream.CopyToAsync(memoryStream); byte[] documentBytes = memoryStream.ToArray(); x = xmlConverter.ExtractTextFromWordDocument(documentBytes); } } } return x; } catch (Exception ex) { Console.WriteLine(ex.Message); return ex.Message; }
2. 优化ExtractTextFromWordDocument方法(可选)
直接接收Stream作为参数,减少内存拷贝操作:
public string ExtractTextFromWordDocument(Stream documentStream) { string extractedText = ""; try { documentStream.Seek(0, SeekOrigin.Begin); using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(documentStream, false)) { var body = wordDocument.MainDocumentPart?.Document.Body; if (body != null) { extractedText = body.InnerText; } } } catch (Exception ex) { Console.WriteLine($"Failed while trying to open as a word doc:{ex.Message}"); } return extractedText; }
对应的调用代码可简化为:
using (var stream = await graphClient.Drives[$"{doc.DriveId}"].Items[$"{doc.ItemId}"].Content.GetAsync()) { x = xmlConverter.ExtractTextFromWordDocument(stream); }
3. 处理MemoryStream超时提示
调试时看到的ReadTimeout异常通常是IDE的观察提示,实际运行时不会抛出。若要彻底规避,可采用上述直接传递Stream的方案,绕开MemoryStream的特性限制。
额外验证建议
- 对比获取的字节数组长度与SharePoint上文件的实际大小,确认数据完整性。
- 将保存的字节数组写入本地文件,用Word打开验证文件是否正常。
内容的提问来源于stack exchange,提问作者dot
相关产品推荐
相关产品推荐

