2011-01-20 26 views
7

Antecedentes¿Cómo aumentar el tamaño POST para un servicio web ASMX?

Estoy desarrollando un control del lado del servidor ASP.Net que necesita hablar con un servicio web ASMX. El control del lado del servidor usa un objeto WebClient para hablar con el servicio web, ya que necesita ser reutilizado a menudo en varias aplicaciones, y para facilitarlo a los desarrolladores, no es necesario que creen una referencia de servicio para el servicio web.

Implementación

Durante el uso del control, se requiere el envío de un objeto serializado al servicio web. El objeto se serializa usando el XmlSerializer y la cadena XML resultante se comprime utilizando la biblioteca de compresión chilkat. La llamada de servicio web para el control se ve de la siguiente manera:

webClient.UploadStringAsync(new Uri(serviceHost + serviceMethod), "POST", sendData)

El contenido de sendData (string) es compressedResponse={CompressedData}.

El servicio web tiene un método definido de la siguiente manera para recibir los datos y luego descomprimir el valor de cadena utilizando la biblioteca chilkat antes de deserializar el objeto usando el XmlSerializer.

public void SaveResponse(string compressedResponse)

La comunicación entre el control y el servicio está funcionando. Inicialmente no se definieron ni se definieron vinculaciones en el web.config para ninguno de los anteriores. Después de búsqueda inicial Yo añado

<httpRuntime maxRequestLength="20480"/>

tanto para el cliente y servidor web.config archivos. Esto no ha hecho ninguna diferencia.

Problema

comprimido o sin comprimir los datos sean publicados en el servicio web en la variable sendData es demasiado grande para una solicitud POST normal, y se corrompe. Esto se confirma al verificar los últimos caracteres de la cadena antes y después de ser publicados en el servidor en formato comprimido, y sin comprimir, al documento Xml le falta la última etiqueta raíz al registrar el depurador. El string no se puede descomprimir y, por lo tanto, la llamada de servicio falla siempre.

¿Cómo puedo aumentar el tamaño POST para la solicitud WebClient para asegurarme de que el servidor reciba la cadena completa?

He revisado las diversas opciones en Google, pero ninguna me proporciona una muestra suficientemente buena de dónde realizar los cambios ni ejemplos de cómo deben verse los cambios. Estoy completamente perdido en cuanto a si el cambio debe realizarse en el servidor o en el sitio web consumidor, y dado que no hay un enlace definido para esto, cómo crear un enlace en el web.config para una llamada de servicio HTTP ASMX.

+0

¿Qué te hace pensar que la cuerda es demasiado larga? ¿Solo el hecho de que no se puede descomprimir? ¿Cómo se ve en Fiddler? –

+0

@John Actualicé la pregunta con la información. Hacer un control básico de la cadena comprimida copiando los últimos caracteres antes de la publicación y validarla contra la cadena publicada. Además, el envío del documento Xml sin comprimir muestra que falta la etiqueta raíz final y se corta a mitad de camino al registrar el depurador. – BinaryMisfit

Respuesta

1

No parece haber ninguna manera de cambiar el tamaño de la POST para un servicio web ASMX cuando sólo se activa HttpPost.

La solución al final fue cambiar el servicio para ejecutar HttpSoap y crear una referencia de servicio para el conjunto que contiene el control. Una vez hecho, el enlace se crea usando código en el control una vez que el punto final se establece a través de una propiedad.

6

Creo que debe alcanzar el límite máximo de longitud de solicitud de ASP.NET. Que se pueden modificar a través del archivo de configuración, tales como:

<system.web> 
    <httpRuntime executionTimeout="240" maxRequestLength="20480" /> 
</system.web> 

valor maxRequestLength es en KB, por lo que por encima de configuración permitiría a 20 MB. También puede aplicar la configuración solo a las URL seleccionadas usando la etiqueta de ubicación, p.

<location path="yourservice.asmx"> 
    <system.web> 
     <httpRuntime executionTimeout="240" maxRequestLength="20480" /> 
    </system.web> 
</location> 
+0

Debería haber agregado a la pregunta que ya he configurado esto tanto para el cliente 'web.config' como para el servidor' web.config'. He actualizado la pregunta para reflejar esto. +1 sin embargo para la respuesta detallada. – BinaryMisfit

+0

@Diago, ¿recibe algún error en particular? ¿Puedes compartir esos detalles? – VinayC

+0

@Diago, también tengo curiosidad sobre cómo está convirtiendo datos comprimidos (presumiblemente en formato de matriz de bytes) en una cadena. Debe aplicar la conversión inversa después del recibo. Base64 sería un buen candidato aquí para codificar datos comprimidos en cadena. – VinayC

Cuestiones relacionadas