2011-05-31 23 views
4

我正在使用DotNetOpenAuth並嘗試將JSON對象發佈到服務器。DotNetOpenAuth POST示例與JSON正文

服務器拋出WebContentType = Raw錯誤。

Authorization: OAuth 
oauth_token="V9vVXD51ehUU6WmY%2FQ41qta0RfY%3D",oauth_consumer_key="CHiawRiAb299cOas",oauth_nonce="BBTM4csg",oauth_signature_method="HMAC-SHA1",oauth_signature="KZJZvT630f2KenB9l9tqSLI%2FfHA%3D",oauth_version="1.0",oauth_timestamp="1306870331" 
Content-Type: application/x-www-form-urlencoded; charset=utf-8 
User-Agent: DotNetOpenAuth/3.4.6.10357 

我想我真的想找一個如何做到這一點的例子嗎?或者一個網址到樣本?

我目前正試圖

WebRequest httpRequest = consumer. 
    PrepareAuthorizedRequest(endpoint, AccessToken, para); 
httpRequest.ContentType = "application/json"; 
WebResponse webResponse = httpRequest.GetResponse(); 
+5

很高興您找到了答案,但您不應該在問題內部回答問題,而是在「答案」部分,因此您可以在一段時間後接受答案。 – veljkoz 2011-06-02 14:04:07

+0

您可以添加如何定義您正在使用的「MessageReceivingEndpoint」端點嗎? – 2011-06-03 03:37:56

+0

抱歉,延遲MessageReceivingEndpoint endpoint = new MessageReceivingEndpoint(serviceBase +「/ Booking/6363241」,HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.PostRequest); – iain 2011-06-08 11:00:21

回答

1

我相信你的錯誤是,你在para傳遞的第三個參數PreparedAuthorizedRequest。如果您傳遞extraParameters,那麼您告訴DotNetOpenAuth這些額外的參數必須包含在消息負載中,這需要特定的內容類型。如果你只是通過null作爲第三個參數,我認爲你可以避免所有這個頭複製和使用自己的自定義內容類型。

+1

嗨,如果我傳遞'null'我不能寫'RequestStream'後調用'PreparedAuthorizedRequest'? – iain 2011-06-02 15:28:34

+0

這樣做可以正常工作,但用戶代理不受尊重。 DNOA始終將代理設置爲庫版本:( – GETah 2016-04-21 10:48:11

3

本來answered by iain

好吧,我設法解決這個問題。我發現的問題是我從ConsumerBase調用PrepareAuthorizedRequest。該內容類型在此之後不會被使用,並且始終標記爲x-www-form-urlencoded。爲了解決這個問題,我正常地調用了PrepareAuthorizedRequest,然後創建了一個新的HttpWebRequest並複製到OAuth授權標頭中。

HttpWebRequest httpRequest = consumer. 
    PrepareAuthorizedRequest(endpoint, AccessToken); 

HttpWebRequest httpWebRequest = (HttpWebRequest) 
    WebRequest.Create(serviceBase + "/Edit/6363241"); 

foreach (string headerKey in httpRequest.Headers.AllKeys) 
    httpWebRequest.Headers.Add(headerKey, httpRequest.Headers[headerKey]); 


httpWebRequest.ContentType = "application/json"; 
httpWebRequest.Method = "POST"; 

using (Stream requestStream = httpWebRequest.GetRequestStream()) 
{ 
    byte[] bytes = Encoding.UTF8.GetBytes(test22); 
    requestStream.Write(bytes, 0, bytes.Length); 
} 

WebResponse webResponse = httpWebRequest.GetResponse(); 

string responseContent = new StreamReader(webResponse.GetResponseStream()). 
    ReadToEnd(); 
1

您需要通過httpRequest.ContentLength屬性設置Content-Length頭獲取請求流之前。

此外,雖然你已經有了它,但我搜索了幾個小時,試圖找出我丟失的是什麼,這是endpoint聲明中的HttpDeliveryMethods.AuthorizationHeaderRequest

string url = serviceBase + "/Booking/6363241"; 
HttpDeliveryMethods methods = HttpDeliveryMethods.PostRequest | HttpDeliveryMethods.AuthorizationHeaderRequest; 
MessageReceivingEndpoint endpoint = new MessageReceivingEndpoint(url, methods); 
WebRequest httpRequest = consumer.PrepareAuthorizedRequest(endpoint, AccessToken); 
httpRequest.ContentType = "application/json"; 

byte[] bytes = Encoding.UTF8.GetBytes(test22); 
httpRequest.ContentLength = bytes.Length; 

using (Stream requestStream = httpRequest.GetRequestStream()) 
{ 
    requestStream.Write(bytes, 0, bytes.Length); 
} 

string responseContent; 
using (HttpWebResposne response = (HttpWebResponse)httpRequest.GetResponseStream()) 
using (StreamReader reader = new StreamReader(response)) 
{ 
    responseContent = reader.ReadToEnd(); 
}