Мне нужно отправить данные 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"))));
Я знаю, что это уродливый способ попробовать даже то, что я не считал решением ... но когда у вас нет другого решения и вы не получаете того, что вам нужно ...
Спасибо за любую помощь!