2012-03-09 11 views
10

Sto chiamando un'API ospitata sul server Apache per pubblicare i dati. Sto usando HttpWebRequest per eseguire POST in C#.GetRequestStream() genera un'eccezione di timeout durante la pubblicazione dei dati nell'URL HTTPS

L'API ha sia la porta normale HTTP che quella del livello sicuro (HTTPS) sul server. Quando chiamo HTTP URL funziona perfettamente. Tuttavia, quando chiamo HTTPS mi dà un'eccezione di timeout (alla funzione GetRequestStream()). Qualche intuizione? Sto usando VS 2010, .Net framework 3.5 e C#. Ecco il blocco di codice:

string json_value = jsonSerializer.Serialize(data); 


     HttpWebRequest request = (HttpWebRequest)System.Net.WebRequest.Create("https://server-url-xxxx.com"); 
     request.Method = "POST"; 
     request.ProtocolVersion = System.Net.HttpVersion.Version10; 
     request.ContentType = "application/x-www-form-urlencoded"; 

     byte[] buffer = Encoding.ASCII.GetBytes(json_value); 
     request.ContentLength = buffer.Length; 
     System.IO.Stream reqStream = request.GetRequestStream(); 
     reqStream.Write(buffer, 0, buffer.Length); 
     reqStream.Close(); 

EDIT: Il programma di console suggerito da Peter funziona bene. Ma quando aggiungo i dati (in formato JSON) che devono essere postati nell'API, esso getta un'eccezione scaduta dall'operazione. Ecco il codice che aggiungo all'applicazione basata su console e genera un errore.

byte[] buffer = Encoding.ASCII.GetBytes(json_value); 
request.ContentLength = buffer.Length; 
+0

Puoi provare senza la ProtocolVersion e ContentType – Peter

+0

anche ottenere Wireshark e dare un'occhiata a ciò che sta accadendo attraverso il filo. controlla che il server di destinazione accetti le chiamate crossdomain. – Peter

+0

Grazie Peter. Ho aggiunto ProtocolVersion e ContentType ma sembra che non sia stato di grande aiuto. Verificherò con wireshark, ma poiché l'app Python può facilmente passare a GET/POST in API, credo che il server stia accettando chiamate interdominio. – Wiz

risposta

10

Non so se questo vi aiuterà con il vostro problema specifico, ma si dovrebbe prendere in considerazione Smaltimento alcuni di questi oggetti quando si è finito con loro. Stavo facendo una cosa del genere di recente e il wrapping di roba usando le istruzioni sembra cancellare un sacco di eccezioni di timeout per me.

  using (var reqStream = request.GetRequestStream()) 
      { 
       if (reqStream == null) 
       { 
        return; 
       } 

       //do whatever 

      } 

controllare anche queste cose

  • è il server che servono https nell'ambiente dev locale?
  • Avete impostato correttamente i collegamenti * .443 (https)?
  • È necessario impostare le credenziali sulla richiesta?
  • È l'account del pool di applicazioni che accede alle risorse https o viene passato il tuo account?
  • Hai mai pensato di utilizzare WebClient?

    using (WebClient client = new WebClient()) 
        {    
         using (Stream stream = client.OpenRead("https://server-url-xxxx.com")) 
         using (StreamReader reader = new StreamReader(stream)) 
         { 
          MessageBox.Show(reader.ReadToEnd()); 
         } 
        } 
    

EDIT:

fare una richiesta dalla console.

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     new Program().Run(); 
     Console.ReadLine(); 
    } 

    public void Run() 
    { 

     var request = (HttpWebRequest)System.Net.WebRequest.Create("https://server-url-xxxx.com"); 
     request.Method = "POST"; 
     request.ProtocolVersion = System.Net.HttpVersion.Version10; 
     request.ContentType = "application/x-www-form-urlencoded"; 

     using (var reqStream = request.GetRequestStream()) 
     { 
      using(var response = new StreamReader(reqStream) 
      { 
       Console.WriteLine(response.ReadToEnd()); 
      } 
     } 
    } 
} 
+0

Grazie per la risposta. 1. No, non serve 2. Sì 3. No. 4. Puoi approfondire ciò? Non l'ho capito 5. Ho provato WebClient ma in .OpenRead si verifica l'errore di timeout dell'operazione – Wiz

+0

Un altro aggiornamento: ho configurato una semplice applicazione Python per accedere alla stessa API su HTTPS e funziona perfettamente. Quindi sembra solo. Net è problematico. Non so perché. – Wiz

+0

stai caricando cassini, iisexpress o iis? – Peter

9

Ho incontrato lo stesso problema. Sembra che sia risolto per me. Ho letto tutto il mio codice assicurandomi di invocare webResponse.Close() e/o responseStream.Close() per tutti i miei oggetti HttpWebResponse. La documentazione indica che è possibile chiudere lo stream o l'oggetto HttpWebResponse. Chiamare entrambi non è dannoso, così l'ho fatto. La mancata chiusura delle risposte potrebbe causare l'esaurimento delle connessioni dell'applicazione per il riutilizzo e questo sembra influire su HttpWebRequest.GetRequestStream per quanto posso osservare nel mio codice.

+0

mi è successo quando utilizzo l'API REST per Azure Mobile Services – Ramakrishna

+0

@ DDRider62 Mi hai salvato il tempo, amico! –

0

Prova questo:

WebRequest req = WebRequest.Create("https://server-url-xxxx.com"); 
    req.Method = "POST"; 
    string json_value = jsonSerializer.Serialize(data); //Body data 
    ServicePointManager.Expect100Continue = false; 
    using (var streamWriter = new StreamWriter(req.GetRequestStream())) 
    { 
     streamWriter.Write(json_value); 
     streamWriter.Flush(); 
     streamWriter.Close(); 
    } 
    HttpWebResponse resp = req.GetResponse() as HttpWebResponse; 
    Stream GETResponseStream = resp.GetResponseStream(); 
    StreamReader sr = new StreamReader(GETResponseStream); 
    var response = sr.ReadToEnd(); //Response 
    resp.Close(); //Close response 
    sr.Close(); //Close StreamReader 

E rivedere l'URI:

  • caratteri riservati.Invia caratteri riservati dal URI può portare problemi ! * ' () ; : @ & = + $ ,/? # [ ]

  • URI Lunghezza: Lei non deve superare i 2000 caratteri

+0

'StreamWriter' chiamerà' Flush() 'e' Close() 'nel suo metodo' Dispose() 'che verrà chiamato per il tuo blocco using. –

Problemi correlati