2013-07-02 88 views
17

我該如何更改WebClient請求的動詞?它似乎只允許/默認爲POST,即使在DownloadString的情況下。如何通過WebClient請求使用動詞GET?

 try 
     { 
      WebClient client = new WebClient();    
      client.QueryString.Add("apiKey", TRANSCODE_KEY); 
      client.QueryString.Add("taskId", taskId); 
      string response = client.DownloadString(TRANSCODE_URI + "task");     
      result = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(response); 
     } 
     catch (Exception ex) 
     { 
      result = null; 
      error = ex.Message + " " + ex.InnerException; 
     } 

而且小提琴手說:

POST http://someservice?apikey=20130701-234126753-X7384&taskId=20130701-234126753-258877330210884 HTTP/1.1 
Content-Length: 0 
+1

你正在做一些非常特別的地方 - [DownloadString](http://msdn.microsoft.com/en-us/library/fhd1f0sw.aspx)使用GET:「...對於HTTP資源,GET方法用來」。 –

+0

奇怪的是,我覺得「下載」方法會使用GET。這是我請求的完整代碼。 – FlavorScape

+0

你完全確定'WebClient'不是一個自定義類嗎? –

回答

24

如果您使用HttpWebRequest,而不是您將獲得對呼叫的更多控制。您可以通過方法屬性,改變REST動詞(默認爲GET)

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(HostURI); 
request.Method = "GET"; 
String test = String.Empty; 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    Stream dataStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(dataStream); 
    test = reader.ReadToEnd(); 
    reader.Close(); 
    dataStream.Close(); 
} 
DeserializeObject(test ...) 
+2

這會工作。我只是好奇爲什麼WebClient在這種情況下使用POST甚至下載 FlavorScape

2

不知道是否可以使用Web客戶端爲。但爲什麼不使用HttpClient.GetAsync方法(字符串)http://msdn.microsoft.com/en-us/library/hh158944.aspx

+3

hm。我想阻止調用者並且不使用異步請求。另一個奇怪的事情是HttpClient不在我的4.5項目的命名空間System.Net.Http下,實際上System.Net.Http不存在。 – FlavorScape

0

正如人們可以在.NET中的源代碼看到,DownloadString的HTTP方法依賴於私人的WebClient實例字段的狀態m_Method,在每次新請求方法調用(link)時清除爲空,並且默認爲Web請求創建者(取決於URI,例如ftp協議獲取另一個創建者),但這不是線程安全的。

也許你正在幾個調用中同時共享這個WebClient實例?

所以它變得困惑。這個或者這個URI會讓WebRequest創建者感到困惑。