JSON-запрос RESTful WCF и ответ json возвращают ноль - PullRequest
2 голосов
/ 23 декабря 2010

Я пытаюсь создать пример для RESTful WCF.Запрос и ответ - JSON.Я получаю ответ:

{"FirstName":null,"LastName":null}

Мне нужно получить правильный ответ.

Вот код:

Web.config имеет конфигурацию для Restful:

договор на обслуживание:

[OperationContract]
        [WebInvoke(UriTemplate = "Data", 
            ResponseFormat = WebMessageFormat.Json)]
        person getData(person name);

Реализация:

public person getData(person name)
{
    return new person{ FirstName= name.FirstName, LastName= name.LastName };
}

[DataContract]

public class person 
{

[DataMember]
public string FirstName;

[DataMember]
public string LastName;
}

Клиент:

class Program
{
static void Main(string[] args)
{
            string baseAddress = "http://localhost/RESTfulService";
 SendRequest(baseAddress + "/Data", "POST", "application/json", @"{""getData"" : {""name"" :{""FirstName"":""John"", ""LastName"":""Doe""}}");
}

  public static string SendRequest(string uri, string method, string contentType, string body)

    {
        string responseBody = null;

        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri);
        req.Method = method;
        if (!String.IsNullOrEmpty(contentType))
        {
            req.ContentType = contentType;
        }
        if (body != null)
        {
            byte[] bodyBytes = Encoding.UTF8.GetBytes(body);
            req.GetRequestStream().Write(bodyBytes, 0, bodyBytes.Length);
            req.GetRequestStream().Close();
        }

        HttpWebResponse resp;
        try
        {
            resp = (HttpWebResponse)req.GetResponse();
        }
        catch (WebException e)
        {
            resp = (HttpWebResponse)e.Response;
        }
        Console.WriteLine("HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);
        foreach (string headerName in resp.Headers.AllKeys)
        {
            Console.WriteLine("{0}: {1}", headerName, resp.Headers[headerName]);
        }
        Console.WriteLine();
        Stream respStream = resp.GetResponseStream();
        if (respStream != null)
        {
            responseBody = new StreamReader(respStream).ReadToEnd();
            Console.WriteLine(responseBody);
        }
        else
        {
            Console.WriteLine("HttpWebResponse.GetResponseStream returned null");
        }
        Console.WriteLine();
        Console.WriteLine(" *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* ");
        Console.WriteLine();

        return responseBody;
    }

}

Ответы [ 4 ]

1 голос
/ 02 марта 2011
public static string SendRequest(string uri, string method, string contentType, string body) {...}

как-то нормально работает только для методов "GET".

Для методов POST мне приходилось по-разному вызывать операции службы на стороне клиента:

uri = "http://localhost/RestfulService";

EndpointAddress address = new EndpointAddress(uri);
WebHttpBinding binding = new WebHttpBinding();
WebChannelFactory<IRestfulServices> factory = new WebChannelFactory<IRestfulServices>(binding, new Uri(uri));
IRestfulServices channel = factory.CreateChannel(address, new Uri(uri));

channel.getData(new Person{firstName = 'John', LastName = 'Doe'});

[ServiceContract]
public interface IRestfulService
{
    [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, UriTemplate = "Data")]
    object getData(Person name)
}
0 голосов
/ 10 сентября 2015

1. Имя метода не требуется для остальных wcf.2. Json deserializer не требует имени параметра, он обрабатывает его как имя свойства.Поэтому используйте {""name"" :{""FirstName"":""John"", ""LastName"":""Doe""}" вместо {""getData"" : {""name"" :{""FirstName"":""John"", ""LastName"":""Doe""}}.

0 голосов
/ 10 сентября 2015

Проблема:

Получение пустого ответа JSON {}

enter image description here

Интерфейс:

[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "Client/{idsHashed}", ResponseFormat = WebMessageFormat.Json)]
Summary GetClientDataById(string idsHashed);

Веб-метод:

public Summary GetClientDataById(string idsHashed)
{
    Summary clientSum = new Summary().GetClientDataById(clientId);
    return clientSum;
}

В классе я превратил поля во внутренние и частные !!!

public class Summary
{
    private string clientName { get; set; }  //<--  wont be rendered out as json because its private

Решение:

Проверьте, чтобы свойства класса были Public.

0 голосов
/ 29 декабря 2010

Я считаю, что объект DataContract должен иметь конструктор без параметров, чтобы сериализатор работал правильно.То есть public Person () {}, также вам может понадобиться добавить геттеры и сеттеры для ваших публичных членов, public string FirstName {get;задавать;}.

...