2009-02-22 23 views
17

Estoy tratando de enviar una solicitud POST a un servicio WCF simple que escribí, pero sigo recibiendo una 400 Solicitud incorrecta. Estoy tratando de enviar datos JSON al servicio. ¿Alguien puede ver lo que estoy haciendo mal? :-)¿Por qué mi cliente C#, POSTING para mi servicio WCF REST, devuelve (400) Solicitud incorrecta?

Ésta es mi interfaz de servicio:

public interface Itestservice 
{ 
    [OperationContract] 
    [WebInvoke(
     Method = "POST", 
     UriTemplate = "/create", 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json)] 
    String Create(TestData testData); 
} 

La aplicación:

public class testservice: Itestservice 
{ 
    public String Create(TestData testData) 
    { 
     return "Hello, your test data is " + testData.SomeData; 
    } 
} 

El DataContract:

[DataContract] 
public class TestData 
{ 
    [DataMember] 
    public String SomeData { get; set; } 
} 

Y por último, mi código de cliente:

private static void TestCreatePost() 
{ 
    Console.WriteLine("testservice.svc/create POST:"); 
    Console.WriteLine("-----------------------"); 

    Uri address = new Uri("http://localhost:" + PORT + "/testweb/testservice.svc/create"); 

    // Create the web request 
    HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; 

    // Set type to POST 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    //request.ContentType = "text/x-json"; 

    // Create the data we want to send 
    string data = "{\"SomeData\":\"someTestData\"}"; 

    // Create a byte array of the data we want to send 
    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); 

    // Set the content length in the request headers 
    request.ContentLength = byteData.Length; 

    // Write data 
    using (Stream postStream = request.GetRequestStream()) 
    { 
     postStream.Write(byteData, 0, byteData.Length); 
    } 

    // Get response 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     // Get the response stream 
     StreamReader reader = new StreamReader(response.GetResponseStream()); 

     // Console application output 
     Console.WriteLine(reader.ReadToEnd()); 
    } 

    Console.WriteLine(); 
    Console.WriteLine(); 
} 

¿Alguien puede pensar en lo que podría estar haciendo mal? Como puede ver en el cliente de C#, he intentado tanto con la aplicación/x-www-form-urlencoded como con text/x-json para ContentType, pensando que podría tener algo que ver con eso, pero parece que no. Probé una versión GET de este mismo servicio y funciona bien, y devuelve una versión JSON de TestData sin problemas. Pero para el poste, bueno, estoy bastante atascado en el momento en este :-(

+0

¿puede suministrar los registros HTTP (cliente y/o servidor)? – defeated

Respuesta

8

Ha intentado "application/json" en lugar de "text/x-JSON". de acuerdo con la aplicación this pregunta desbordamiento de pila/JSON es el único tipo de soporte JSON válida.

+0

Eso fue todo, gracias :-) –

0

Probar:

[OperationContract] 
[WebInvoke(
    Method = "POST", 
    UriTemplate = "/create", 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, 
    /* non-wrapped */ BodyStyle = WebMessageBodyStyle.Bare)] 
String Create(TestData testData); 
+0

solo toma un parámetro. ¿realmente importa si está envuelto o no? En este caso, el servidor rechaza la solicitud porque no se desea el contentType en la solicitud. –

+0

sí, contentType también está mal. Pero tuve este problema yo mismo, así que estaba bastante seguro de que era el BodyStyle el que causaba esto. – baretta

4

el único problema aquí es la ContentType.

intento (recomendado)

request.ContentType = "application/json; charset=utf-8"; 

o (esto también funcionará)

request.ContentType = "text/json; charset=utf-8"; 

Ambos anterior resuelve el problema. Sin embargo, se recomienda el primero, para obtener detalles de la comprobación de la especificación JSON-RPC 1.1 http://json-rpc.org

Cuestiones relacionadas