Запрос HttpClient post с дайджест-аутентификацией приводит к неправильному запросу

#c# #authentication #post #hash #httpclient

Вопрос:

Я использую следующий код для извлечения записей с камеры Dahua XVR, и он успешно возвращает записи.

 var domain = "http://IP";  var credCache = new CredentialCache();  credCache.Add(new Uri(domain), "Digest", new   NetworkCredential(username, password));  var httpClient = new HttpClient(new HttpClientHandler {   Credentials = credCache });  var result= await httpClient.GetStringAsync(new Uri(URL));   

но когда я публикую записи, используя следующий код, он не работает и приводит к неправильному запросу.

 string url = "http://IP/cgi-bin/faceRecognitionServer.cgi";   var postData = new Listlt;KeyValuePairlt;string, stringgt;gt;()  {  new KeyValuePairlt;string, stringgt;( "action", "addPerson"),  new KeyValuePairlt;string, stringgt;("groupID", "1"),  new KeyValuePairlt;string, stringgt;("name", "Test Name"),  new KeyValuePairlt;string, stringgt;("birthday", "1980-01-05"),  new KeyValuePairlt;string, stringgt;("sex", "Male"),  new KeyValuePairlt;string, stringgt;("country", "Pakistan"),  new KeyValuePairlt;string, stringgt;("province", "KPK"),  new KeyValuePairlt;string, stringgt;("city", "Peshawar")  };  var content = new FormUrlEncodedContent(postData);   var domain = "http://IP";  var credCache = new CredentialCache();  credCache.Add(new Uri(domain), "Digest", new NetworkCredential(username, password));  var httpClient = new HttpClient(new HttpClientHandler { Credentials = credCache });  var result = await httpClient.PostAsync(new Uri(url), content);  

приведенный выше код всегда возвращает 400 неверных запросов. может ли кто-нибудь помочь?

Комментарии:

1. Prbolem, вероятно, связан с url-адресом

Ответ №1:

Я исправил проблему, как показано ниже. Может быть, это кому-то поможет.

  1. уменьшен размер изображения, которое я должен был вставить в тело запроса.
  2. объединил URL-адрес и параметры в одну строку.
     string url = "http://IP/cgi-bin/faceRecognitionServer.cgi?   action=addPersonamp;groupID=1amp;name=TestNameamp;sex=Male";   string domain = "http://IP";  CredentialCache credCache = new CredentialCache {  {  new Uri(domain), "Digest", new NetworkCredential(username,   password)  }  };  using HttpClient client = new HttpClient(new HttpClientHandler {   Credentials = credCache });   using FileStream stream =    File.OpenRead(AppContext.BaseDirectory. Replace("\bin\Debug\netcoreapp3.1", "")   "Files\14.jpg");  var file_content = new ByteArrayContent(new StreamContent(stream).ReadAsByteArrayAsync().Result);  file_content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");  var response = await client.PostAsync(url, file_content);