2009-07-02 2 views
3

Я получаю доступ к веб-сервису REST из приложения VB. Я создаю объект HttpWebResponse и вызываю GetRequestStream на нем просто отлично, но когда я вызываю GetResponse, я получаю исключение 401.Обработка аутентификации с помощью HttpWebRequest (.NET)

Вот мой код (модифицирован для размещения):

Dim webRequest = DirectCast(WebRequest.Create(endpoint), HttpWebRequest) 
webRequest.Method = "POST" 
webRequest.ContentLength = contentLength 
webRequest.ContentType = "application/x-www-form-urlencoded" 

request.Credentials = New NetworkCredential(Username, Password) 

' Works fine 
Using stream As Stream = webRequest.GetRequestStream() 
    stream.Write(data, 0, data.Length) 
End Using 

' Barfs 
Dim response As HttpWebResponse = DirectCast(webRequest.GetResponse(), HttpWebResponse) 

я получаю 401 исключение, как только я называю "webRequest.GetResponse()". В ответе есть заголовок «WWW-Authenticate» с соответствующей сферой. Я попытался установить «webRequest.PreAuthenticate = True», а также вручную настроить заголовок с помощью «webRequest.Headers.Add (HttpRequestHeader.Authorization, _authheader)»

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

Спасибо заранее,

--Connor

ответ

1

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

3

Попробуйте добавить вручную добавив заголовок AUTHORIATION, что-то вроде ...

string autorization = userName + ":" + password; 
byte[] binaryAuthorization = System.Text.Encoding.UTF8.GetBytes(autorization); 
autorization = Convert.ToBase64String(binaryAuthorization); 
autorization = "Basic " + autorization; 
webRequest.Add("AUTHORIZATION", autorization); 

Это работает для меня в прошлом, когда настройка свойства Credentials не удалась.

+0

Я пробовал это, но это не сработало для меня. –

+0

Не могу поверить, что мне пришлось прибегать к ручному добавлению заголовка авторизации, чтобы заставить мой веб-запрос работать, но он работал, когда 'request.Credentials = New NetworkCredential (Username, Password)' did not. Поскольку я использовал HttpWebRequest, я добавил АВТОРИЗАЦИЮ с помощью 'request.Headers.Add (« АВТОРИЗАЦИЯ », авторизация); – cwadding

0

Это, конечно, возможно, что это не ваша проблема, но у меня были проблемы аутентификации в прошлом, которые были зафиксированы путем установки

request.ProtocolVersion = HttpVersion.Version10