2010-08-09 57 views
1

我試圖訪問一個REST Web服務,但我的代碼不能正常工作,並不斷拋出一個HTTP 401錯誤訪問REST的WebService在VB.NET

看到這個例子屏幕帽從Wireshark的初始SSL請求:

WireShark Screenshot

這是一個捲曲的呼叫使用相同的細節相同的Web地址。問題是,在我的VB.NET版本中,缺少SSL數據包的「Extension:server_name」(和相關的)部分,我相信這會導致服務器在接下來的幾個數據包中不回覆服務器密鑰交換。

下面是VB.NET代碼

Dim webRequest As HttpWebRequest = DirectCast(System.Net.WebRequest.Create(UrlString), HttpWebRequest) 
    webRequest.Method = "GET" 
    webRequest.ContentType = "application/x-www-form-urlencoded" 

    webRequest.Credentials = New NetworkCredential(username, password) 

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

這失敗的最後一行(HTTP 401錯誤),問題似乎並沒有涉及到我的代理和用戶憑據對服務器正確這個請求來自Curl和wget。

我已經嘗試設置AuthenticationLevel以及手動設置授權標頭,並且PreAuthenticate似乎也沒有改變這個問題。

回答

1

答案是WebService的是不是一個有效HTTP401 WWW-Authenticate頭回答,而不是隻是用類似的代碼返回:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Error> 
    <ErrorCode>NO_SUITABLE_AUTHENTICATION_METHOD</ErrorCode> 
    <ErrorDescription>No suitable active authentication mechanism found to authorise request - authorise using supported mechanisms</ErrorDescription> 
    <RequestID>gcqsrtvn</RequestID> 
    <SystemTime>2010-08-12T09:14:21.831+10:00</SystemTime> 
</Error> 

所以我不得不手動添加認證頭,如下所示: http://devproj20.blogspot.com/2008/02/assigning-basic-authorization-http.html

代碼:

Dim authBytes() As Byte = System.Text.Encoding.UTF8.GetBytes(String.Format("{0}:{1}", username, password).ToCharArray()) 
webRequest.Headers("Authorization") = "Basic " + Convert.ToBase64String(authBytes) 
+0

這似乎沒有什麼意義。在你的問題中,你寫道你得到了401回來,並且你試圖自己添加授權頭,它沒有工作。那麼,它爲什麼現在工作?另外,如果您只想在第一個請求中發送授權標頭,則可以設置PreAuthenticate = true,並將CredentialCache上的憑證設置爲auth方法的「Basic」。 ****無論如何,就像我說的,如果你根據我給的指示得到了一絲痕跡,我可以告訴你發生了什麼事。服務器期望授權標題是不合法的,但不會對客戶端提出質疑。 – feroze 2010-08-12 20:30:59

+0

我回來的401不符合標準,它不包含任何auth頭信息。 至於爲什麼它以前沒有工作,這是由於編碼問題和我用於手動頭的代碼。同時設置PreAuthenticate在這種情況下不起作用,我連接的服務非常瑣碎,喜歡以特定的方式完成工作......但沒有關於如何執行的文檔。 合法與否並不重要,它不是這樣做的,那是我的問題。 – Seph 2010-08-13 01:14:09