2010-03-10 8 views
8

Sto utilizzando un client di servizio Web C# tradizionale generato in VS2008 .Net 3.5, che eredita da SoapHttpClientProtocol. Questo è il collegamento a un servizio Web remoto scritto in Java.Come configurare un client del servizio Web C# per inviare l'intestazione e il corpo della richiesta HTTP in parallelo?

Tutta la configurazione è stato fatto in codice durante l'inizializzazione del client, e può essere visto sotto:

 ServicePointManager.Expect100Continue = false; 
     ServicePointManager.DefaultConnectionLimit = 10; 

     var client = new APIService 
     { 
      EnableDecompression = true, 
      Url = _url + "?guid=" + Guid.NewGuid(), 
      Credentials = new NetworkCredential(user, password, null), 
      PreAuthenticate = true, 
      Timeout = 5000 // 5 sec 
     }; 

Funziona tutto bene, ma il tempo necessario per eseguire la chiamata metodo più semplice è quasi il doppio del tempo della rete ping. Considerando che un client di prova Java prende più o meno lo stesso del tempo di rete ping:

C# client ~ 550ms 
Java client ~ 340ms 
Network ping ~ 300ms 

Dopo aver analizzato il traffico TCP per una sessione scoperto i seguenti:

In sostanza, il client C# inviato pacchetti TCP nel seguente ordine .

Client Send HTTP Headers in one packet. 
Client Waits For TCP ACK from server. 
Client Sends HTTP Body in one packet. 
Client Waits For TCP ACK from server. 

Il client Java ha inviato pacchetti TCP nella seguente sequenza.

Client Sends HTTP Headers in one packet. 
Client Sends HTTP Body in one packet. 
Client Revieves ACK for first packet. 
Client Revieves ACK for second packet. 
Client Revieves ACK for second packet. 

Esiste un modo per configurare il C# servizio Web client per inviare l'intestazione/corpo in parallelo, come appare al client Java?

Qualsiasi aiuto o suggerimento molto apprezzato.

+0

È possibile annusare le intestazioni http per la richiesta .Net e la richiesta java e confrontarle? (E suppongo che il client java usi lo stesso proxy) –

+0

scusa, quando dico proxy intendo come in una classe proxy, piuttosto che un proxy http – Christopher

+0

testo modificato per rimuovere i riferimenti a 'proxy' e sostituire con 'client' – Christopher

risposta

0

Penso che sia possibile utilizzare il metodo ereditato EndGetRequestStream per hackerare SoapHttpClientProtocol. Salvalo in un buffer fino al completamento della richiesta. Quindi crea il tuo stream e spingilo fuori tutto in una volta.

1

Grazie per la risposta, Rob, alla fine ho optato per utilizzare la generazione del riferimento Aggiungi servizio/WCF, che lo fa per impostazione predefinita. Probabilmente perché utilizza le nuove librerie HTTP sottostanti.

Ho avuto alcuni problemi di generazione del proxy WCF con metodi SOAP che restituiscono matrici non elaborate di oggetti complessi (ad es. Restituire un oggetto che contiene una matrice di oggetti funzionava correttamente). Per ovviare a ciò, è necessario avvolgere gli array in oggetti oppure passare la configurazione del server SOAP da RPC a DOCUMENT (che è ciò che abbiamo fatto).

Problemi correlati