我正在使用以下代码下载存储在 GitLab 中的 zip 文件:
using (HttpClientHandler handler = new HttpClientHandler())
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
using (HttpClient client = new HttpClient(handler))
{
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://my.gitlab.space/api/v4/projects/100/packages/generic/mypackage/1.0.0.0/myZipFile.zip");
request.Headers.Add("PRIVATE-TOKEN", "myTokenHere");
HttpResponseMessage response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
byte[] data = Encoding.UTF8.GetBytes(responseBody);
File.WriteAllBytes(@"D:\myZipFile.zip", data);
}
}
这应该等同于以下 curl 命令:
curl --header “私人令牌:myTokenHere” “https://my.gitlab.space/api/v4/projects/100/packages/generic/mypackage/1.0.0.0/myZipFile.zip” --output myZipFile.zip
以上代码和 curl 命令工作正常,除了我无法将字节数组数据转换为本地磁盘中的 zip 文件。默认情况下,字节数组已经是一个 zip 文件。
我做错了什么。
用
ReadAsByteArrayAsync
代替ReadAsStringAsync
。您想直接读取文件字节的内容。
byte[] data = await response.Content.ReadAsByteArrayAsync();
您的主要问题是您正在以字符串形式读取数据。您可以将其作为字节读取,但将响应流直接复制到文件中效率更高。
其他问题:
static HttpClient
ServicePointManager
,因为它会在整个应用程序中设置设置。改用客户端。SecurityProtocol
。依靠操作系统选择最佳协议。static HttpClient _client = new
{
DefaultRequestHeaders = {
ExpectContinue = true,
},
};
using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://my.gitlab.space/api/v4/projects/100/packages/generic/mypackage/1.0.0.0/myZipFile.zip");
request.Headers.Add("PRIVATE-TOKEN", "myTokenHere");
using HttpResponseMessage response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
using var file = File.OpenWrite(@"D:\myZipFile.zip");
using var stream = await response.Content.ReadAsStreamAsync();
await stream.CopyToAsync(file);