2013-02-22 52 views
1

我正在向在線交易REST API發出OAuth 1.0a請求。據我所知,下面的代碼是提出請求的方式,但我在request.ContentLength = postData.Length;行上得到了「此屬性無法在寫入啓動後設置」消息......我不明白爲什麼。如果這不是將POST數據添加到經過OAuth身份驗證的Web請求發出之前的方式,那麼是什麼?寫作開始後,無法設置此屬性...我什麼時候開始寫作?

var request = consumer.PrepareAuthorizedRequest(new DotNetOpenAuth.Messaging.MessageReceivingEndpoint(new Uri(this.EndPointAddress, relativeUri), method), this.AccessToken); 
request.Method = (method == DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest) ? "POST" : "GET"; 
if (postValues != null && postValues.Count > 0) 
{ 
    //There is POST data associated with this request, include it 
    var postData = KVPCollectionToString(postValues); 
    request.ServicePoint.Expect100Continue = false; 
    request.ContentLength = postData.Length; 
    Logger.Trace(t => t("POST Data: {0}", postData)); 
    using (var stream = request.GetRequestStream()) 
    { 
     var pBytes = System.Text.Encoding.UTF8.GetBytes(postData); 
     stream.Write(pBytes, 0, pBytes.Length); 
    } 
} 

回答

3

簡答: 如果您想在OAuth請求中傳遞其他信息,則應使用PrepareAuthorizedRequest的其他重載之一。您可以將POST參數列表提供給添加到請求中的方法。

較長的答案:

PrepareAuthorizedRequest方法將寫入請求之前,你甚至得到HttpWebRequest回來。這意味着在發生這種情況後你不能改變內容的長度。

爲了親身體驗這一點,您可以深入瞭解DotNotOpenAuth源代碼。如果您查看Channel課程,給定PrepareAuthorizedRequest調用的參數,您最終將以Channel.InitializeRequestAsPost結束。您會注意到兩件事:

  • 您不必將方法設置爲POST,DotNetOpenAuth會爲您執行此操作。
  • 要提供請求中的參數,您應該使用其中一個帶有名稱/值對詞典的重載將它們傳遞到PrepareAuthorizedRequest
+0

這是知道的好信息!修改我的代碼以發送我的POST值的IDictionary '成功創建了請求。當然,它失敗了一些通用的'signature_method_rejected'問題,但這是另一個問題。謝謝! – 2013-02-22 01:54:19

0

它看起來像你試圖寫入請求流而不是響應字符串,你不能修改請求只響應。

+0

好吧,如果你有請求數據發送,它必須可以*以某種方式*寫入請求流。但我甚至沒有明白這一點。它在'request.ContentLength = postData.Length;'行上爆炸了。 – 2013-02-22 01:34:20

+1

我認爲你在這裏(或我)是誤解。請求和響應流都是同一個套接字的一部分,它們只是在InputStream和OutputStream中分離出來。所以你從請求流中讀取數據,並寫入響應流。 – Alxandr 2013-02-22 01:43:18

+1

在我提出請求時,我是否會寫入請求並從響應中讀取數據?我*認爲*您正在考慮將此作爲ASP.NET入站請求,但這是對外部API的出站請求。請原諒,如果我錯了。 – 2013-02-22 01:47:20