Странная проблема аутентификации HTTP - PullRequest
0 голосов
/ 05 сентября 2011

У меня возникают проблемы при попытке установить связь с веб-сервером (Apache 2.2.17) с использованием дайджест-проверки подлинности и отправкой данных методом POST: всегда возвращается ошибка 401.Однако это хорошо работает, когда мы не публикуем данные или когда Fiddler работает (даже при публикации данных) ... У вас есть представление о том, что может вызвать проблему?

public void DoRequest(string v_strURL, XmlDocument v_objXMLDoc)
{

var credentialCache = new CredentialCache();

credentialCache.Add(new Uri("http://" + ServerIP + "/"), "Digest", new NetworkCredential("admin", "test", "realm"));

String RequestContent = "request=" + v_objXMLDoc.InnerXml.Replace(' ', '+');
Uri Url = new Uri(v_strURL);

HttpWebRequest objHttpWebRequest;
HttpWebResponse objHttpWebResponse = null;

Stream objRequestStream = null;

byte[] bytes = new byte[0];
bytes = System.Text.Encoding.UTF8.GetBytes(RequestContent);

objHttpWebRequest = (HttpWebRequest)WebRequest.Create(v_strURL);
objHttpWebRequest.UserAgent = "MySampleCode";
objHttpWebRequest.Credentials = credentialCache;
objHttpWebRequest.Method = "POST";
objHttpWebRequest.ContentLength = bytes.Length;
objHttpWebRequest.ContentType = "text/xml; encoding='utf-8'";
objHttpWebRequest.ContentType = "application/x-www-form-urlencoded";

objRequestStream = objHttpWebRequest.GetRequestStream();
objRequestStream.Write(bytes, 0, bytes.Length);
objRequestStream.Close();

objHttpWebResponse = (HttpWebResponse)objHttpWebRequest.GetResponse();

}

Ответы [ 3 ]

2 голосов
/ 05 сентября 2011

По какой причине вы устанавливаете заголовок Content-Type дважды?Это вряд ли сделает то, что вы хотите.Кроме того, почему вы помещаете кредиты в кэш с IP-адресом сервера, а не именем хоста?

HTTP / 401 предполагает, что сервер запрашивает у клиента учетные данные.Ожидается, что клиент ответит, повторно отправив запрос с прикрепленными учетными данными.Один ключевой вопрос в том, что в случае сбоя клиент пытается отправить учетные данные, а они отклонены, или вообще не пытается отправить учетные данные?

Возможно, вам следует использовать Netmon или Wireshark для более низкого уровня.Посмотрите на уровень, если Fiddler «волшебным образом» решает проблему для вас.

1 голос
/ 05 сентября 2011

Имя хоста в вашем вызове HttpWebRequest.Create () (т.е. v_strUrl) совпадает с именем хоста в вызове credentialCache.Add () (т.е. ServerIP)? Если нет, то это всегда будет неудачей.

Вместо использования CredentialCache, просто добавьте учетные данные непосредственно в объект HttpWebRequest

request.Credentials = new NetworkCredential ("пользователь", "пароль", "область");

и посмотрим, сработает ли это.

0 голосов
/ 14 сентября 2011

Мы наконец решили проблему:

objHttpWebRequest.ServicePoint.Expect100Continue = false;
...