首页 文章

从VSTS下载带有画布的docx文件时,WebClient DownloadFile无法正常工作

提问于
浏览
0

当我从带有WebClient的VSTS下载包含'Drawing Canvas'的.docx文件时,下载的.docx文件已损坏 . 当我说破了,我的意思是我们无法手动打开Word文档,我们有下一条错误消息:“文件已损坏,无法打开” .

只有当word文件包含canvas并且从VSTS下载时才会发生这种情况?如果我从TFS2017下载或.docx文件不包含Canvas而不是一切正常 .

首先,我认为该问题与编码有关,所以我测试了我在WebClient中找到的所有编码 . 进行与编码相关的任何更改都无法解决当前问题 .

此外,我试图改变实现方式,我们不使用方法DownloadFile而不是那个,我下载了字节数组并基于字节生成的Word文档 . 随着实施的这种变化,我们遇到了与以前相同的问题 .

这是代码示例:

static void Main(string[] args)
        {
            var tfsUri = new Uri("https://.../");
            var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(tfsUri);
            var workItemStore = projectCollection.GetService<WorkItemStore>();
            var workItem = workItemStore.GetWorkItem(2);
            projectCollection.EnsureAuthenticated();
            var credentials = workItemStore.TeamProjectCollection.Credentials;
            var fileName = "D:\\test_folder\\files\\System.Description.docx";
            var uri = workItem.Attachments[0].Uri;
            using (var request = new WebClient() { Credentials = credentials })
            {
                request.DownloadFile(uri, fileName);
            }
        }

如果您有任何想法,感谢您的帮助 .

1 回答

  • 1

    此问题不是由docx文件中的画布引起的 . 如果您使用代码从VSTS下载文件,即使docx文件中只有文本,该文件也应该被破坏 .

    这里的问题是VSTS的身份验证与TFS不同,因此WebClient下载文件请求实际上在下载文件时获得401,因为它没有下载文件所需的权限 . 将代码更新为以下内容,然后重试:

    using System;
        using Microsoft.TeamFoundation.Client;
        using Microsoft.TeamFoundation.WorkItemTracking.Client;
        using Microsoft.TeamFoundation.WorkItemTracking.Proxy;
        using System.IO;
    
        namespace GetAdmin
        {
            class Program
            {
                static void Main(string[] args)
                {
    
                    TfsTeamProjectCollection ttpc = new TfsTeamProjectCollection(new Uri("https://xxx.visualstudio.com/"));
                    ttpc.EnsureAuthenticated();
                    WorkItemStore wistore = ttpc.GetService<WorkItemStore>();
                    WorkItem wi = wistore.GetWorkItem(111);
                    WorkItemServer wiserver = ttpc.GetService<WorkItemServer>();
                    string tmppath = wiserver.DownloadFile(wi.Attachments[0].Id);
                    string filename = @"D:\test\test.docx";
                    File.Copy(tmppath,filename);
                }
            }
    
    }
    

相关问题