2010-03-10 13 views
8

Estoy usando un cliente tradicional de servicio web C# generado en VS2008 .Net 3.5, heredando de SoapHttpClientProtocol. Esto se está conectando a un servicio web remoto escrito en Java.¿Cómo configuro un cliente del servicio web C# para enviar el encabezado y el cuerpo de solicitud HTTP en paralelo?

Toda la configuración se realiza en código durante la inicialización del cliente, y se puede ver a continuación:

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

Todo funciona bien, pero el tiempo necesario para ejecutar el más simple llamada al método es casi el doble del tiempo de ping red. Mientras que un cliente de prueba de Java tiene aproximadamente el mismo que el tiempo de ping de red:

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

Después de analizar el tráfico TCP para una sesión descubrió lo siguiente:

Básicamente, el C# cliente envía paquetes TCP en el siguiente orden .

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. 

El cliente de Java envió paquetes TCP en la siguiente secuencia.

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. 

hay alguna forma de configurar el cliente de servicios web C# para enviar la cabecera/cuerpo en paralelo como el cliente Java parece?

Cualquier ayuda o consejos muy apreciados.

+0

¿Puedes oler los encabezados http de la solicitud .Net y la solicitud java y compararlos? (Y supongo que el cliente java usa el mismo proxy) –

+0

lo siento, cuando digo proxy quiero decir como en una clase de proxy, en lugar de un proxy http – Christopher

+0

texto editado para eliminar las referencias a 'proxy' y reemplazarlo por 'cliente' – Christopher

Respuesta

0

Creo que puede utilizar el método EndGetRequestStream heredado para hackear el protocolo SoapHttpClientProtocol. Guárdalo en un buffer hasta que la solicitud haya finalizado. Luego crea tu propia transmisión y presiona todo al mismo tiempo.

1

Gracias por la respuesta Rob, finalmente opté por utilizar la generación de Agregar referencia de servicio/proxy WCF, que hace esto de forma predeterminada. Probablemente porque está usando debajo las bibliotecas HTTP más nuevas.

Tuve algunos problemas de generación de proxy WCF con métodos SOAP que devuelven matrices en bruto de objetos complejos (es decir, devolver un objeto que contiene una matriz de objetos bien trabajados). Para evitar esto, debe envolver sus matrices en objetos o cambiar la configuración del servidor SOAP de RPC a DOCUMENT (que es lo que hicimos).

Cuestiones relacionadas