使用校验和 (C#) 部署到 Artifactory 时出现问题
Problem Deploying to Artifactory with Checksum (C#)
好的,
嗯,我正在想办法做到这一点。
我已经准备好 API 但这从来没有用过。
using (HttpClient client = new HttpClient())
{
if (!path.EndsWith("/")) path = $"{path}/";
string url = config.CreateRequest(client, null, $"{path}{file.Name}");
string sha1 = JFrogLoader.GetSha1Hash(file);
string sha256 = JFrogLoader.GetSha256Hash(file);
string md5 = JFrogLoader.GetMD5Hash(file);
using (Stream stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
StreamContent content = new StreamContent(stream);
client.DefaultRequestHeaders.Add("X-Checksum-Deploy", "true");
client.DefaultRequestHeaders.Add("X-Checksum-Sha1", sha1);
client.DefaultRequestHeaders.Add("X-Checksum-Sha256", sha256);
client.DefaultRequestHeaders.Add("X-Checksum", md5);
content.Headers.Add("Content-Type", "application/octet-stream");
HttpResponseMessage message = await client.PutAsync(url, content);
string response = await message.Content.ReadAsStringAsync();
return message.StatusCode == System.Net.HttpStatusCode.Created;
}
}
问题是,如果我不使用任何 "X-Checksum-"
header 项目,部署工作正常,但是当您导航到 Artifactory 中的页面时,它有 "Fix Checksum" 按钮。所以我想我应该提供它们。
我生成校验和的方法使用“*CryptoServiceProvider”类 和 trim 来自计算的哈希字符串的最终“=”。但是每次我添加校验和 headers 时,我都会得到 "Unable to read data from the transport connection : An existing connection was forcibly closed by the remote host".
的 multi-part 异常
我试过使用 content.Headers
和 client.DefaultRequestHeaders
。
我试过只提供 SHa1
.
我试过命名 md5
X-Checksum-Md5
(不在 api 中,但认为值得一试)。
没有任何效果,我的连接被主机关闭了。
我应该如何解决这个问题?
提前致谢。
好吧,花了一段时间,但经过反复试验,我发现问题出在我使用的 has 算法上。
通过 C# 加载校验和的正确解决方案如下:
using (HttpClient client = new HttpClient())
{
if (!path.EndsWith("/")) path = $"{path}/";
string url = config.CreateRequest(client, null, $"{path}{file.Name}");
string sha1 = JFrogLoader.GetSha1Hash(file);
string sha256 = JFrogLoader.GetSha256Hash(file);
string md5 = JFrogLoader.GetMD5Hash(file);
using (Stream stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
StreamContent content = new StreamContent(stream);
content.Headers.Add("Content-Type", "application/octet-stream");
client.DefaultRequestHeaders.Add("X-Checksum-Deploy", "true");
client.DefaultRequestHeaders.Add("X-Checksum-Sha1", sha1);
client.DefaultRequestHeaders.Add("X-Checksum-Sha256", sha256);
client.DefaultRequestHeaders.Add("X-Checksum-Md5", md5);
HttpResponseMessage message = await client.PutAsync(url, content);
string response = await message.Content.ReadAsStringAsync();
return message.StatusCode == System.Net.HttpStatusCode.Created;
}
}
public static string GetSha1Hash(FileInfo file)
{
using (var sha1 = new SHA1CryptoServiceProvider())
{
return JFrogLoader.GetHash(file, sha1);
}
}
public static string GetSha256Hash(FileInfo file)
{
using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider())
{
return JFrogLoader.GetHash(file, sha256);
}
}
public static string GetMD5Hash(FileInfo file)
{
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
return JFrogLoader.GetHash(file, md5);
}
}
private static string GetHash(FileInfo file, HashAlgorithm hasher)
{
using (Stream stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
byte[] hash = hasher.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
}
关键是我最初使用的是 Convert.ToBase64String 而不是 BitConverter 到十六进制字符串。不幸的是,Artifcatory在它的错误消息中并不清楚,并在网络请求中触发了异常。
谢谢
好的,
嗯,我正在想办法做到这一点。
我已经准备好 API 但这从来没有用过。
using (HttpClient client = new HttpClient())
{
if (!path.EndsWith("/")) path = $"{path}/";
string url = config.CreateRequest(client, null, $"{path}{file.Name}");
string sha1 = JFrogLoader.GetSha1Hash(file);
string sha256 = JFrogLoader.GetSha256Hash(file);
string md5 = JFrogLoader.GetMD5Hash(file);
using (Stream stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
StreamContent content = new StreamContent(stream);
client.DefaultRequestHeaders.Add("X-Checksum-Deploy", "true");
client.DefaultRequestHeaders.Add("X-Checksum-Sha1", sha1);
client.DefaultRequestHeaders.Add("X-Checksum-Sha256", sha256);
client.DefaultRequestHeaders.Add("X-Checksum", md5);
content.Headers.Add("Content-Type", "application/octet-stream");
HttpResponseMessage message = await client.PutAsync(url, content);
string response = await message.Content.ReadAsStringAsync();
return message.StatusCode == System.Net.HttpStatusCode.Created;
}
}
问题是,如果我不使用任何 "X-Checksum-"
header 项目,部署工作正常,但是当您导航到 Artifactory 中的页面时,它有 "Fix Checksum" 按钮。所以我想我应该提供它们。
我生成校验和的方法使用“*CryptoServiceProvider”类 和 trim 来自计算的哈希字符串的最终“=”。但是每次我添加校验和 headers 时,我都会得到 "Unable to read data from the transport connection : An existing connection was forcibly closed by the remote host".
我试过使用 content.Headers
和 client.DefaultRequestHeaders
。
我试过只提供 SHa1
.
我试过命名 md5
X-Checksum-Md5
(不在 api 中,但认为值得一试)。
没有任何效果,我的连接被主机关闭了。
我应该如何解决这个问题? 提前致谢。
好吧,花了一段时间,但经过反复试验,我发现问题出在我使用的 has 算法上。
通过 C# 加载校验和的正确解决方案如下:
using (HttpClient client = new HttpClient())
{
if (!path.EndsWith("/")) path = $"{path}/";
string url = config.CreateRequest(client, null, $"{path}{file.Name}");
string sha1 = JFrogLoader.GetSha1Hash(file);
string sha256 = JFrogLoader.GetSha256Hash(file);
string md5 = JFrogLoader.GetMD5Hash(file);
using (Stream stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
StreamContent content = new StreamContent(stream);
content.Headers.Add("Content-Type", "application/octet-stream");
client.DefaultRequestHeaders.Add("X-Checksum-Deploy", "true");
client.DefaultRequestHeaders.Add("X-Checksum-Sha1", sha1);
client.DefaultRequestHeaders.Add("X-Checksum-Sha256", sha256);
client.DefaultRequestHeaders.Add("X-Checksum-Md5", md5);
HttpResponseMessage message = await client.PutAsync(url, content);
string response = await message.Content.ReadAsStringAsync();
return message.StatusCode == System.Net.HttpStatusCode.Created;
}
}
public static string GetSha1Hash(FileInfo file)
{
using (var sha1 = new SHA1CryptoServiceProvider())
{
return JFrogLoader.GetHash(file, sha1);
}
}
public static string GetSha256Hash(FileInfo file)
{
using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider())
{
return JFrogLoader.GetHash(file, sha256);
}
}
public static string GetMD5Hash(FileInfo file)
{
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
return JFrogLoader.GetHash(file, md5);
}
}
private static string GetHash(FileInfo file, HashAlgorithm hasher)
{
using (Stream stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
byte[] hash = hasher.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
}
关键是我最初使用的是 Convert.ToBase64String 而不是 BitConverter 到十六进制字符串。不幸的是,Artifcatory在它的错误消息中并不清楚,并在网络请求中触发了异常。
谢谢