2010-10-04 81 views
6

我試圖發送一個簡單的POST請求到REST Web服務並打印響應(代碼如下,主要取自Yahoo!開發人員文檔和提供的一些MSDN代碼片段文檔)。我希望客戶端發送:C#REST客戶端使用POST發送數據

請求方法:POST(即我希望$ _ SERVER [ 'REQUEST_METHOD'] == 'POST' 在PHP)
數據:富=欄(即$ _ POST [ '富' ] ==在PHP '酒吧')

然而,這似乎是發送:

請求方法:FOO = BARPOST
數據:(空白)

我知道API的工作,因爲我」我已經用Python和PHP編寫的客戶端進行了測試,所以我非常確定它必定是我的C#的一個問題。我不是一個交易的.NET程序員,所以我會很感激任何關於如何確定問題的評論/指針 - 我相信這是一件微不足道的事情,但我無法自己發現它。

uri,用戶和密碼變量是在代碼的早期設置的 - 它們可以很好地處理GET請求。

request = (HttpWebRequest) WebRequest.Create(uri); 
request.Credentials = new NetworkCredential(user, password); 
request.Method = WebRequestMethods.Http.Post; 
request.ContentType = "application/x-www-form-urlencoded"; 

string postData = "foo=bar"; 
request.ContentLength = postData.Length; 

StreamWriter postStream = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII); 
postStream.Write(postData); 
postStream.Close(); 

response = (HttpWebResponse) request.GetResponse(); 

REST API使用PHP編寫,並且使用C#客戶端時服務器上的$ _POST數組爲空。

回答

9

最終發現,這似乎如果代碼編輯,像這樣以解決問題的HttpWebRequest.PreAuthenticate屬性:

request = (HttpWebRequest) WebRequest.Create(uri); 
request.PreAuthenticate = true; 
request.Credentials = new NetworkCredential(user, password); 
request.Method = WebRequestMethods.Http.Post; 

從文檔我相信這股勢力驗證實際發送POST請求之前。我不確定爲什麼類不會自動執行此操作(其他語言的庫使此過程透明,除非您明確關閉它),但它已解決了我的問題,並可能爲其他人節省另外兩天的搜索時間和拔毛。

對於它的價值,PreAuthenticate不需要爲GET請求設置,只需要POST,但是如果您爲GET請求設置它,一切仍然可以工作,但需要稍微延長。

相關問題