2011-08-02 52 views
17

我在C#中發送POST請求時出現問題,並且似乎我誤解了一些HTTP基礎知識。所以基本上我執行問題的REST服務客戶,其工作如下:使用用戶名/密碼在C#中的RESTfull/HTTP請求中添加標題和發佈數據

  1. 製作POST請求,並得到令牌
  2. 使用此令牌頭(授權:TOKEN),同時使其他GET/POST/PUT請求

我使用WebRequest進行GET請求(帶有授權標頭)並且它正在工作。但是當我使用下面的代碼,使PUT請求,服務是給「驗證失敗 - 在沒有登錄」的消息:

String url = String.Format("{0}/{1}", AN_SERVER, app); 
WebRequest theRequest = WebRequest.Create(url); 
theRequest.Method = "POST"; 

theRequest.ContentType = "text/x-json"; 
theRequest.ContentLength = json.Length; 
Stream requestStream = theRequest.GetRequestStream(); 

requestStream.Write(Encoding.ASCII.GetBytes(json), 0, json.Length); 
requestStream.Close(); 


theRequest.Headers.Add("Authorization", authToken); 

HttpWebResponse response = (HttpWebResponse)theRequest.GetResponse(); 

我必須做一些小錯誤(至少我希望如此),同時發送POST請求。那麼我做錯了什麼?

謝謝。

+4

你有沒有試過移動Headers.Add在requestStream之前?另一件看起來很奇怪的事情是沒有傳遞給請求的命名參數,比如requestStream.Write(「json =」+ json) –

+0

@AI W:在requestStream解決問題之前移動標頭。爲什麼訂單在這裏很重要?非常感謝你。我花了一天的時間試圖「學習」這一點,30分鐘的Stackoverflow更有幫助。你可以把它寫成答案,以便我可以接受它。再次感謝。順便說一句,它是json對象被放入請求,而不是命名參數。 –

+0

服務器是否接受非授權服務的PUT請求? IIRC PUT(和DELETE)在某些版本的IIS上未默認啓用,因此其他服務器也可能如此。 – carlosfigueira

回答

8

在請求蒸汽工作之前移動標題(根據AI W的評論),因爲請求流正在添加正文。

webrequest在內部實現的方式,您需要在寫入主體之前完成標題,並且一旦其以流格式發送,就準備發送。

如果你看看在反射器或某些這樣的反編譯工具中的webrequest的實現,你將能夠看到邏輯。

希望這會有所幫助

+2

似乎是一個很差的實現,我不驚訝它造成了混淆。 –

+0

它有點繁瑣,但一旦你習慣了它,它的使用相對簡單。人們往往會相對迅速地碰到webrequest或webclient的限制,並開始使用httpwebrequest。 – stevenrcfox

相關問題