Estoy implementando un método de acción proxy que reenvía la solicitud web entrante y la reenvía a otra página web, agregando algunos encabezados. El método de acción funciona para las solicitudes GET, pero aún tengo problemas para reenviar la solicitud POST entrante.Copiando Http Request InputStream
El problema es que no sé cómo escribir correctamente el cuerpo de la solicitud en la secuencia de solicitud HTTP saliente.
Aquí hay una versión abreviada de lo que tengo hasta ahora:
//the incoming request stream
var requestStream=HttpContext.Current.Request.InputStream;
//the outgoing web request
var webRequest = (HttpWebRequest)WebRequest.Create(url);
...
//copy incoming request body to outgoing request
if (requestStream != null && requestStream.Length>0)
{
long length = requestStream.Length;
webRequest.ContentLength = length;
requestStream.CopyTo(webRequest.GetRequestStream())
}
//THE NEXT LINE THROWS A ProtocolViolationException
using (HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse())
{
...
}
Tan pronto como me llamo GetResponse en la solicitud HTTP saliente, tengo la siguiente excepción:
ProtocolViolationException: You must write ContentLength bytes to the request stream before calling [Begin]GetResponse.
I No entiendo por qué sucede esto, ya que requestStream.CopyTo debería haberse ocupado de escribir la cantidad correcta de bytes.
Cualquier sugerencia sería muy apreciada.
Gracias,
Adrian
pregunta relacionada - http://stackoverflow.com/questions/226784/how-to-create-a-simple-proxy-in-c –
@James Manning: Gracias por el enlace, pero estoy mucho más allá de eso. Mi proxy funciona bien para todo tipo de solicitudes GET. Es solo el cuerpo de la solicitud POST que todavía me está dando problemas. –
¿Ha intentado llamar a Stream.Flush() en la ruta devuelta por webRequest.GetRequestStream() antes de proceder a llamar a webRequest.GetResponse()? –