2013-01-07 189 views
0

我需要從VB.NET應用程序中使用Web資源。我已成功檢索到訪問令牌,並準備使用它來調用受保護的資源。但是,每次我調用受保護的資源時,我都會收到一個401 Unauthorized響應,因爲授權字段尚未添加到標題中。.NET HttpWebRequest oAuth 401未授權

這是我的代碼。

WebRequest = DirectCast(Net.WebRequest.Create(ApiUri), HttpWebRequest) 
WebRequest.Method = "POST" 
WebRequest.ContentType = "application/json" 
WebRequest.ContentLength = Bytes.Length 
Dim RequestStream As IO.Stream = WebRequest.GetRequestStream 
RequestStream.Write(Bytes, 0, Bytes.Length) 
RequestStream.Close() 
WebRequest.Headers("Authorization") = "OAuth " & _ 
             "oauth_version=""1.0""," & _ 
             "oauth_nonce=""" & Nonce & """," & _ 
             "oauth_timestamp=""" & TimeStamp & """," & _ 
             "oauth_consumer_key=""" & ConsumerKey & """," & _ 
             "oauth_token=""" & Token & """," & _ 
             "oauth_signature_method=""HMAC-SHA1""," & _ 
             "oauth_signature=""" & Signature & """" 
WebResponse = DirectCast(WebRequest.GetResponse(), HttpWebResponse) 

然後我使用Fiddler監視請求。我在Fiddler看到的所有內容都是401響應的請求,如下所示(不包括機構)。

請求

POST ***url*** HTTP/1.0 
Content-Type: application/json 
Host: ***host*** 
Content-Length: 45 
Connection: Keep-Alive 

響應

HTTP/1.0 401 Unauthorized 
X-Powered-By: PHP/5.3.13 
WWW-Authenticate: Basic realm="***realm***" 
Content-type: application/json 
Content-Length: 79 
Connection: keep-alive 
Date: Mon, 07 Jan 2013 01:13:22 GMT 
Server: lighttpd/1.4.28 

無論我讀過在互聯網上表明的HttpWebRequest應該先挑戰服務器並接收401響應,因爲我在這裏看到。它應該再次嘗試與授權字段添加到標題並獲得200 OK響應。第二部分不會發生。我不理解這是如何正確工作的,或者我做錯了什麼?

+1

考慮使用現有的oAuth庫(http://oauth.net/code/)。手工操作可能會讓你瘋狂。 – Jason

+0

謝謝你的迴應。我已經在使用該網站的代碼。我其實整個oAuth舞蹈都能正常工作。這不是問題。我不相信這個問題甚至與oAuth有關(我只是將它包括在帖子中以便完整)。我相信這個問題與HttpWebRequest相關,以及它如何與服務器進行通信。 – user1227445

+0

您是否使用代理服務? –

回答

0

原來,您需要使用BinaryWriter而不是Stream來添加內容。

所以不是這個。

WebRequest.ContentLength = Bytes.Length 
Dim RequestStream As IO.Stream = WebRequest.GetRequestStream 
RequestStream.Write(Bytes, 0, Bytes.Length) 
RequestStream.Close() 

這樣做。

Using Writer As New IO.BinaryWriter(WebRequest.GetRequestStream) 
    Writer.Write(Bytes) 
End Using 
+0

我想在GetRequestStream之前添加你的頭文件也可以。 – noobie