2010-10-04 33 views
6

Estoy intentando enviar una solicitud POST simple a un servicio web REST e imprimir la respuesta (el código está debajo, principalmente tomado de la documentación del desarrollador de Yahoo y los fragmentos de código MSDN provistos con algunos de la documentación). Yo esperaría que el cliente envíe:Cliente C# REST enviando datos utilizando POST

Solicitud Método: POST (es decir, espero $ _SERVER [ 'REQUEST_METHOD'] == 'post' en PHP)
datos: foo = bar (es decir, $ _POST [ 'foo' ] == 'bar' en PHP)

Sin embargo, parece ser el envío:

Solicitud Método: FOO = BARPOST
datos: (en blanco)

sé que la API funciona como I' lo he probado con clientes escritos en Python y PHP, así que estoy bastante seguro de que debe ser un problema con mi C#. No soy un programador .NET de oficio, por lo que agradecería cualquier comentario/sugerencia sobre cómo averiguar cuál es el problema. Estoy seguro de que es algo trivial, pero no puedo detectarlo por mi cuenta.

uri, las variables de usuario y contraseña se configuraron anteriormente en el código; funcionan bien con las solicitudes GET.

request = (HttpWebRequest) WebRequest.Create(uri); 
request.Credentials = new NetworkCredential(user, password); 
request.Method = WebRequestMethods.Http.Post; 
request.ContentType = "application/x-www-form-urlencoded"; 

string postData = "foo=bar"; 
request.ContentLength = postData.Length; 

StreamWriter postStream = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII); 
postStream.Write(postData); 
postStream.Close(); 

response = (HttpWebResponse) request.GetResponse(); 

La API REST está escrito en PHP, y la matriz $ _POST está vacía en el servidor cuando se utiliza el cliente de C#.

Respuesta

9

Al final encontramos la propiedad HttpWebRequest.PreAuthenticate que parece resolver el problema si el código se edita este modo:

request = (HttpWebRequest) WebRequest.Create(uri); 
request.PreAuthenticate = true; 
request.Credentials = new NetworkCredential(user, password); 
request.Method = WebRequestMethods.Http.Post; 

De la documentación supongo que esta autenticación fuerzas antes de la solicitud POST real se envía. No estoy seguro de por qué la clase no hace esto automáticamente (las bibliotecas para otros idiomas hacen que este proceso sea transparente, a menos que lo desactive explícitamente), pero me ha solucionado el problema y puede salvar a otra persona otros 2 días de búsqueda y tirar del pelo.

Por lo que vale, PreAuthenticate no necesita establecerse para solicitudes GET, solo POST, aunque si lo configura para una solicitud GET, todo seguirá funcionando, pero tardará un poco más.

Cuestiones relacionadas