Почему мой клиент С#, отправляя POST в мою службу WCF REST, возвращает (400) неверный запрос?

Я пытаюсь отправить запрос POST в простую службу WCF, которую я написал, но я продолжаю получать 400 Bad Request. Я пытаюсь отправить данные JSON в службу. Может ли кто-нибудь определить, что я делаю неправильно? :-)

Это мой сервисный интерфейс:

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

Реализация:

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

Контракт данных:

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

И, наконец, мой клиентский код:

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();
}

Кто-нибудь может подумать, что я могу делать неправильно? Как вы можете видеть в клиенте C#, я пробовал и application/x-www-form-urlencoded, и text/x-json для ContentType, думая, что это может иметь какое-то отношение к этому, но, похоже, это не так. Я пробовал GET-версию этой же службы, и она отлично работает и без проблем возвращает JSON-версию TestData. Но для POST, ну, в данный момент я довольно застрял в этом :-(


person Rob    schedule 22.02.2009    source источник
comment
можете ли вы предоставить какие-либо журналы http (клиент и/или сервер)?   -  person defeated    schedule 23.02.2009


Ответы (3)


Вы пробовали «application/json» вместо «text/x-json». Согласно этому вопросу о переполнении стека application/json является единственным допустимым типом мультимедиа json.

person Darrel Miller    schedule 22.02.2009

Единственная проблема здесь — ContentType.

попробуйте (рекомендуется)

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

или (это тоже сработает)

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

Оба вышеуказанных решают проблему. Тем не менее, рекомендуется первый вариант. Подробную информацию о спецификации JSON-RPC 1.1 см. на странице http://json-rpc.org/wd/JSON-RPC-1-1-WD-20060807.html#ResponseHeaders.

person Community    schedule 22.02.2009

Пытаться:

[OperationContract]
[WebInvoke(
  Method = "POST",
  UriTemplate = "/create",
  RequestFormat = WebMessageFormat.Json,
  ResponseFormat = WebMessageFormat.Json,
  /* non-wrapped */ BodyStyle = WebMessageBodyStyle.Bare )]
String Create(TestData testData);
person baretta    schedule 22.02.2009
comment
он принимает только один параметр. какая разница завернутый он или нет? В этом случае сервер отклоняет запрос, потому что contentType в запросе нежелателен. - person Ray Lu; 23.02.2009
comment
да, contentType тоже неверен. Но у меня самого была эта проблема, поэтому я был уверен, что причиной этого был BodyStyle. - person baretta; 23.02.2009