【问题标题】:Problem Deploying to Artifactory with Checksum (C#)使用校验和 (C#) 部署到 Artifactory 时出现问题
【发布时间】:2019-10-17 02:53:06
【问题描述】:

好的, 好吧,我正在尝试弄清楚如何做到这一点。
我已经准备好了 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
我试过命名md5X-Checksum-Md5(不在api中,但认为值得一试)。 没有任何效果,我的连接被主机关闭。

任何想法我应该如何解决这个问题? 提前致谢。

【问题讨论】:

    标签: c# .net httpclient artifactory checksum


    【解决方案1】:

    好吧,花了一些时间,但经过反复试验,我发现问题出在我使用的 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 请求中触发了异常。

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2022-01-25
      • 2012-04-13
      相关资源
      最近更新 更多