使用校验和 (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.Headersclient.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在它的错误消息中并不清楚,并在网络请求中触发了异常。

谢谢