Проблема развертывания на артефакте с помощью контрольной суммы (C #) - PullRequest
0 голосов
/ 17 октября 2019

Ладно, я пытаюсь выяснить, как это сделать.
У меня есть готовый 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, она имеет кнопку «Fix Checksum». Так что я решил, что, вероятно, должен предоставить их. Мои методы, которые генерируют контрольные суммы, используют классы "* CryptoServiceProvider" и обрезают окончательный '=' из вычисленной строки хеша. Но каждый раз, когда я добавляю заголовки контрольной суммы, я получаю исключение из нескольких частей для «Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом».

Я пыталсяиспользуя content.Headers и client.DefaultRequestHeaders. Я попытался только предоставить SHa1.
Я попытался назвать md5 X-Checksum-Md5 (которого нет в API, но решил, что это стоило того). Ничего не работает, и я получаю соединение, закрытое хостом.

Есть идеи, как мне решить эту проблему? Заранее спасибо.

1 Ответ

0 голосов
/ 23 октября 2019

Что ж, потребовалось некоторое время, но, используя небольшое количество проб и ошибок, я обнаружил, что проблема была в алгоритме 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 не ясно в своем сообщении об ошибке и вызвал исключение в веб-запросе.

Спасибо

...