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

如何通过.NET API获取TFS 2017u2安全文件的下载票据?

解决TFS 2017 Update 2获取安全文件下载票据的问题

我之前也碰到过类似的问题,TFS 2017 Update 2的.NET客户端API确实在GetSecureFileAsync的includeDownloadTicket参数上有一些兼容性坑,下面是我摸索出来的解决办法:

一、先排查核心原因

TFS 2017 Update 2对应的REST API版本是3.1,而Microsoft.TeamFoundation.DistributedTasks.WebApi NuGet包的部分高级参数(比如includeDownloadTicket)在这个版本的服务端可能还没有完全支持,或者客户端封装的API没有正确传递参数到服务端,导致即使设为true也返回null。

另外,还要确认你的账号是否具备以下权限:

  • 项目集合级:查看安全文件权限
  • 项目级:下载安全文件权限
    如果权限不足,服务端也不会返回下载票据。

二、可行的解决方案

方案1:使用匹配版本的NuGet包并调整调用方式

确保你安装的Microsoft.TeamFoundation.DistributedTasks.WebApi NuGet包版本和TFS 2017 Update 2兼容,推荐使用15.112.1版本(对应VS 2017 Update 2的API版本)。然后尝试指定明确的API版本调用:

using Microsoft.TeamFoundation.DistributedTasks.WebApi;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;

var tfsUri = new Uri("http://your-tfs-server:8080/tfs/YourCollection");
var credentials = new VssBasicCredential("", "your-pat-token"); // 也可以用域账号身份验证

using (var connection = new VssConnection(tfsUri, credentials))
{
    var client = connection.GetClient<SecureFilesHttpClient>();
    
    // 关键:指定api-version为3.1,匹配TFS 2017u2的服务端版本
    var secureFile = await client.GetSecureFileAsync(
        project: "YourProjectName",
        secureFileId: Guid.Parse("your-secure-file-id"),
        includeDownloadTicket: true,
        apiVersion: "3.1"
    );
    
    if (secureFile.Ticket != null)
    {
        // 成功获取票据后,可构建下载链接:$"{tfsUri}/_apis/distributedtask/securefiles/{secureFile.Id}/content?ticket={secureFile.Ticket}"
    }
}

方案2:直接调用REST API(更可靠)

如果客户端API还是不生效,直接调用TFS的REST端点是更稳妥的方式,因为可以完全控制请求参数:

using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;

var tfsUri = "http://your-tfs-server:8080/tfs/YourCollection/YourProjectName";
var secureFileId = "your-secure-file-guid";
var patToken = "your-personal-access-token";

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    // PAT身份验证:将PAT转成Base64格式
    var authHeader = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($":{patToken}"));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeader);
    
    var requestUri = $"{tfsUri}/_apis/distributedtask/securefiles/{secureFileId}?includeDownloadTicket=true&api-version=3.1";
    var response = await client.GetAsync(requestUri);
    
    if (response.IsSuccessStatusCode)
    {
        var secureFile = await response.Content.ReadFromJsonAsync<SecureFile>();
        if (!string.IsNullOrEmpty(secureFile.Ticket))
        {
            // 拿到票据后立即使用,有效期通常只有几分钟
        }
    }
}

// 自定义匹配响应的模型类
public class SecureFile
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Ticket { get; set; }
    // 按需添加其他需要的属性
}

三、额外注意事项

  • 如果用域账号身份验证,可以替换HttpClient的身份验证逻辑为:var handler = new HttpClientHandler { UseDefaultCredentials = true }; var client = new HttpClient(handler);
  • 下载票据的有效期很短,一定要在获取后立即用来下载文件,避免过期失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:20:29