使用校验和(C#)部署到人工工厂的问题

问题描述 投票:0回答:1

好,好吧,我正在尝试找出方法。我已经准备好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-"标头项目,则部署有效,但是当您导航到Artifactory中的页面时,它具有“修复校验和”按钮。因此,我认为我应该提供它们。我生成校验和的方法使用“ * CryptoServiceProvider”类,并从计算出的哈希字符串中修剪最终的“ =”。但是,每次我添加校验和标头时,都会收到一个多部分的异常:“无法从传输连接读取数据:远程主机强行关闭了现有连接”。

我尝试使用content.Headersclient.DefaultRequestHeaders。我尝试只提供SHa1。我尝试命名md5 X-Checksum-Md5(它不在api中,但认为值得一试)。什么都没用,我被主机关闭了连接。

任何想法我应该如何解决?预先感谢。

c# .net httpclient artifactory checksum
1个回答
0
投票

嗯,花了一段时间,但使用了一些反复试验,我发现问题出在我使用的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的错误消息不清楚,并在Web请求中触发了异常。

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.