C # HttpWebRequest - не удается разрешить этот запрос: «Клиент добавляет хеш MD5 в заголовок HTTP X-OriginalHash» - PullRequest
0 голосов
/ 24 июня 2019

Мне нужно отправить данные JSON и получить ответ от / с веб-сервера. Я могу общаться с веб-сервером, он дает мне отзывы о JSON (что исправить). В какой-то момент мне выдается следующее сообщение об ошибке:

Информация хеша не соответствует подписи сообщения.

Об этом сообщении в документации (присланной владельцами этого веб-сервера) говорится следующее:

=====================================

Система репозитория проверит контрольную сумму сообщения, чтобы убедиться, что данные не были подделаны между частями всей системы репозитория. Сообщения, где хэш недействителен, не принимаются Эта проверка целостности гарантирует, что сообщения, составляющие трафик, не могут быть изменены при передаче или в пределах частей системы репозитория, а также сообщения не могут быть добавлены или удалены из последовательности без обнаружения. Клиент добавляет MD5-хэш в HTTP-заголовок X-OriginalHash.

Эта структура затем добавляется к сообщению

Заголовок сообщения

| X-OriginalHash | 1234567890abcdefghijklmnopqrstuvwxyz |

| Тип контента | приложение / JSON |

| Авторизация | <Жетон> |

=====================================

Итак, он говорит, что я должен добавить хеш MD5 к этому HTTP-заголовку. Но я не могу найти решение этой проблемы.

Мой код выглядит следующим образом:

=============================================== ===========

private void sendDataToWebserver()
{
    token = myFunctionToGetOauthToken();
    byte[] byteBodyProd = Encoding.UTF8.GetBytes(requestTextBox.Text);

    HttpWebRequest bearerReqProd = WebRequest.Create("https://webserver.com") as HttpWebRequest;
    bearerReqProd.Method = "POST";
    bearerReqProd.PreAuthenticate = true;
    bearerReqProd.ContentType = "application/json";
    bearerReqProd.ContentLength = byteBodyProd.Length;
    bearerReqProd.Headers.Add("Authorization", token);
    bearerReqProd.Headers.Add("grant_type", "client_credentials");
    bearerReqProd.Headers.Add("cache-control", "no-cache");

    bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text));

    Stream newStreamProd = bearerReqProd.GetRequestStream();
    newStreamProd.Write(byteBodyProd, 0, byteBodyProd.Length);

    WebResponse bearerRespProd = null;
    try

        bearerRespProd = bearerReqProd.GetResponse();
    }
    catch (WebException webErr)
    {
        string response;

        using (var reader = new System.IO.StreamReader(webErr.Response.GetResponseStream()))
        {
            response = reader.ReadToEnd();
            statusText.Text += "\r\n" + "responseProd=" + response.ToString();
        }

        statusText.Text += "\r\n" + "Eroare WebException(Prod): " + webErr.Message;
        return;
    }
    catch (Exception err)
    {
        statusText.Text += "\r\n" + "Eroare Exception(Prod): " + err.Message;
        return;
    }

    var responseProd = "";
    using (var reader = new StreamReader(bearerRespProd.GetResponseStream(), Encoding.UTF8))
    {
        responseProd = reader.ReadToEnd();
        statusText.Text += "\r\n" + "responseProd=" + responseProd.ToString();
    }
}

   private string CreateMD5(string input)
    {
        // Use input string to calculate MD5 hash
        using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
        {
            byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
            //byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(input);
            byte[] hashBytes = md5.ComputeHash(inputBytes);

            // Convert the byte array to hexadecimal string
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hashBytes.Length; i++)
            {
                sb.Append(hashBytes[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }

=============================================== ===========

Данные для отправки находятся в requestTextBox.Text, и пример:

{"ID1": "EO144IB3002",

"ID2": "FACILIB300",

"Event_Time": "19062320",

"Destination_ID1": "2"}

В приведенном выше коде строка кода, которую я создал для этой спецификации хеширования MD5:

bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text));

Это правильный путь? Кажется, нет, потому что я получаю ошибку. Есть ли какой-нибудь стандартный способ, которым я должен делать то, что они спрашивают о добавлении заголовка HTTP-хэша MD5? Я также попробовал много альтернатив:

bearerReqProd.Headers.Add("X-OriginalHash", bearerReqProd.GetHashCode().ToString());
bearerReqProd.Headers.Add("X-OriginalHash", System.Convert.ToBase64String(byteBodyProd));
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(System.Text.Encoding.UTF8.GetString(byteBodyProd, 0, byteBodyProd.Length)));
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text));
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text + "1234567890abcdefghijklmnopqrstuvwxyz"));
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5(requestTextBox.Text) + "1234567890abcdefghijklmnopqrstuvwxyz");
bearerReqProd.Headers.Add("X-OriginalHash", "1234567890abcdefghijklmnopqrstuvwxyz");
bearerReqProd.Headers.Add("X-OriginalHash", CreateMD5("1234567890abcdefghijklmnopqrstuvwxyz"));
bearerReqProd.Headers.Add("X-OriginalHash", Convert.ToBase64String(MD5.Create().ComputeHash(System.Text.Encoding.ASCII.GetBytes("1234567890abcdefghijklmnopqrstuvwxyz"))));

Я знаю, что это уродливый способ попробовать даже то, что я не считал решением ... но когда у вас нет другого решения и вы не получаете того, что вам нужно ...

Спасибо за любую помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...