2013-07-02 17 views
17

Come posso modificare il verbo di una richiesta WebClient? Sembra consentire solo/default al POST, anche nel caso di DownloadString.Come utilizzare verbo GET con richiesta WebClient?

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

E Fiddler dice:

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

Si sta facendo qualcosa di molto speciale da qualche parte - [DownloadString] (http://msdn.microsoft.com/en-us/library/fhd1f0sw.aspx) utilizza GET: "... Per una risorsa HTTP, il metodo GET si usa". –

+0

Strano, ho pensato che i metodi "Download" avrebbero usato GET. Questa è la totalità del mio codice per questa richiesta. – FlavorScape

+0

Sei completamente sicuro che 'WebClient' non è una classe personalizzata? –

risposta

24

Se si utilizza HttpWebRequest, si otterrebbe un maggiore controllo della chiamata. È possibile cambiare il verbo REST dalla proprietà Method (di default è 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

Questo funzionerebbe. Sono solo curioso di sapere perché WebClient in questo caso utilizza il POST anche per il download FlavorScape

2

Non sono sicuro se è possibile utilizzare WebClient per questo. Ma perché non utilizzare il metodo HttpClient.GetAsync (stringa) http://msdn.microsoft.com/en-us/library/hh158944.aspx

+3

hm. Voglio bloccare il chiamante e non utilizzare la richiesta asincrona. Un'altra cosa strana è che HttpClient non è nello spazio dei nomi System.Net.Http nel mio progetto 4.5, infatti System.Net.Http non esiste. – FlavorScape

0

Come si può vedere nel codice sorgente di .NET, il metodo HTTP della DownloadString dipende dallo stato del campo di istanza WebClient privato m_Method, che viene cancellato a nullo ad ogni nuova chiamata del metodo di richiesta (link) e le impostazioni predefinite al Creatore richiesta Web (dipende dall'URI, ad esempio il protocollo ftp ottiene un altro creatore), ma questo non è thread-safe.

Forse stai condividendo questa istanza WebClient tra più chiamate contemporaneamente?

Quindi si confonde. O questo o l'URI confonde il creatore di WebRequest.