2013-07-02 8 views
17

Wie kann ich das Verb einer WebClient-Anfrage ändern? Es scheint nur zu erlauben/Standard zu POST, sogar im Fall von DownloadString.Wie verwende ich das Verb GET mit der WebClient-Anfrage?

 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; 
     } 

Und Fiedler sagt:

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

Sie tun etwas ganz besonderes irgendwo - [DownloadString] (http://msdn.microsoft.com/en-us/library/fhd1f0sw.aspx) verwendet GET: "... Für eine HTTP-Ressource, die GET-Methode wird eingesetzt". –

+0

Seltsam, ich dachte, "Download" -Methoden würden GET verwenden. Das ist die Gesamtheit meines Codes für diese Anfrage. – FlavorScape

+0

Sind Sie ganz sicher, 'WebClient' ist keine benutzerdefinierte Klasse? –

Antwort

24

Wenn Sie stattdessen HttpWebRequest verwenden, würden Sie mehr Kontrolle über den Anruf erhalten. Sie können den Rest Verb durch die Eigenschaft Methode ändern (Standard: 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

Das würde funktionieren. Ich bin nur neugierig, warum WebClient in diesem Fall POST sogar für Download verwendet – FlavorScape

2

Nicht sicher, ob Sie WebClient dafür verwenden können. Aber warum nicht verwenden HttpClient.GetAsync Methode (String) http://msdn.microsoft.com/en-us/library/hh158944.aspx

+3

hm. Ich möchte den Anrufer blockieren und keine asynchrone Anfrage verwenden. Eine andere seltsame Sache ist HttpClient ist nicht unter Namespace System.Net.Http in meinem Projekt 4.5, in der Tat System.Net.Http existiert nicht. – FlavorScape

0

Wie man in dem Quellcode von .NET, die HTTP-Methode der DownloadString hängt vom Zustand der privaten WebClient-Instanz sehen m_Method, das bei jedem Aufruf der neuen Request-Methode auf null zurückgesetzt wird (link) und standardmäßig auf den Web-Request-Creator verweist (abhängig vom URI, z. B. FTP-Protokoll erhält einen anderen Ersteller), aber dies ist nicht Thread-sicher.

Vielleicht teilen Sie diese WebClient-Instanz gleichzeitig mit mehreren Anrufen?

So wird es verwirrt. Entweder dies oder der URI verwirrt den WebRequest-Ersteller.