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

使用MS Graph读取SharePoint中Docx文件时遇“流不支持超时”错误求助

问题解决:读取SharePoint Word文件时提示损坏及Stream超时异常

核心问题定位

  1. 二进制文件处理错误:Word文档(尤其是.docx)本质是ZIP压缩包格式的二进制文件,你用StreamReader读取后转成ASCII字符串再转回字节数组的过程,会直接破坏原始二进制数据结构,导致Open XML SDK无法识别文件,进而触发“文件损坏”提示。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:51:14