5

Estoy desarrollando C# \ XAML aplicación metro-ui. Quiero llamar a algún servicio y voy a usar HttpWebRequest para esto. La realización anterior de HttpWebRequest contiene ContentLength y UserAgent propiedades. Pero la realización de WinRT no lo tiene. Traté de usar el enfoque descrito en este post. Funciona para UserAgent pero no para ContentLength. He tratado de establecer Headers¿Cómo agregar un encabezado a HttpWebRequest en la aplicación de Windows 8?

request.Headers["Content-length"] = Length; 
request.Headers["User-agent"] = UserAgent; 

pero recibió la excepción "encabezado 'Content-length' debe ser modificado mediante la propiedad o método apropiado."

¿Es posible establecer Headers en en WinRT?

+0

Si elimina la configuración de la longitud del contenido, ¿funciona? Es posible que HttpWepRequest no le permita establecer la longitud del contenido porque lo calcula en función del contenido que está enviando. –

+0

@LarryOsterman No. Además, debo establecer la propiedad 'Content-type'. Así que debería comentarlo también. Para el enfoque descrito a través del enlace: obtengo '400 Bad Request' cuando comento estas propiedades. Cuando comenté esto para 'HttpWebRequest', recibí webexception' La conexión subyacente estaba cerrada: la conexión se cerró inesperadamente. – RredCat

+0

Hmmm. Puedo ver que HttpWebRequest bloquea el ajuste de contenido-longitud (ya que puede calcular el contenido-longitud). La mala solicitud implica que hay algo mal con el mensaje que se envía, ¿qué muestra Fiddler que enviaste? –

Respuesta

12

HttpWebRequest tiene un estado semi-obsoleto en WinRT. Algunos valores de encabezado que podrían modificarse previamente en plataformas .NET anteriores ya no pueden modificarse con él.

Parece que HttpClient es el nuevo y mejorado reemplazo de HttpWebRequest con una API simple y soporte totalmente asincrónico.

Dado que desea especificar Content-Length, supongo que está intentando PUBLICAR o PONER algo en el servidor. En ese caso, querrá usar PostAsync() o PutAsync() según corresponda.

var req = new HttpClient(); 
    req.DefaultRequestHeaders.Add("User-agent", UserAgent); 
    req.DefaultRequestHeaders.Add("Content-length", Length); 
    return await req.PostAsync(RequestURL, Body); 

Es probable que no necesita realmente para especificar la cabecera Content-Length, ya que se incluirá automáticamente por los métodos basados ​​en la longitud real del cuerpo, pero se puede tratar de cualquier manera.

+0

Sí ... Tienes razón ... Gracias por tu respuesta. Estoy jugando con algo así como ... Pero como puedo ver "Body" es del tipo "HttpContent", ¿verdad? Y colocaste tus parámetros, ¿verdad? ¿Podría explicar cómo puso params en el ejemplo de 'HttpContent'? – RredCat

+0

Lo encontré. Acabo de codificar la cadena de parámetros a 'ASCII'. Pero no es una solución completa. Mencioné en un comentario a @Larry Osterman que tuve problemas para configurar 'ContentType'. Encontré la forma de hacerlo - 'content.Headers.ContentType = new MediaTypeHeaderValue ("application/x-www-form-urlencoded");' Lo que sea, te marqué como una respuesta porque estás muy cerca de responder. – RredCat

Cuestiones relacionadas