Служба WCF - JSON - данные не возвращаются - PullRequest
1 голос
/ 06 декабря 2010

У меня есть простой прототип службы WCF, основанный на классах POCO Entity Framework.Когда я запускаю один из представленных методов без указания формата ответа, он возвращает ожидаемые данные в формате XML в браузер.Однако, если я укажу «ResponseFormat = WebMessageFormat.Json», данные не будут возвращены в браузер.Если я пытаюсь использовать Fiddler, чтобы узнать больше о том, что происходит, я обнаружил, что ответ на запрос браузера «Ошибка ReadResponse (): сервер не возвратил ответ на этот запрос».

ВотДоговор на обслуживание:

 [ServiceContract]
public interface ITimeService
{
    [OperationContract]
    [WebGet(UriTemplate = "/Customer?ID={customerID}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    Customer GetCustomer(string customerID);

    [OperationContract]
    [WebGet(UriTemplate = "/Customers", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<Customer> GetCustomers();

    [OperationContract]
    [WebGet(UriTemplate = "/Tasks/?CustomerID={customerID}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<Task> GetTasks(string customerID);

}

И реализация:

public Customer GetCustomer(string customerID)
    {
        var ID = new Guid(customerID);
        var context = new PinPointTimeEntities();
        var customer = context.Customers.Include("TimePeriods").Include("Tasks").Where(c => c.ID == ID).SingleOrDefault<Customer>();
        return customer;
    }

    public List<Customer> GetCustomers()
    {
        var context = new PinPointTimeEntities();
        var customers = context.Customers.ToList();
        return customers;
    }

    public List<Task> GetTasks(string customerID)
    {
        var ID = new Guid(customerID);
        var context = new PinPointTimeEntities();
        var tasks = context.Tasks.Include("TimePeriods").Where(c => c.CustomerID == ID).ToList();
        return tasks;
    }

Я попробовал несколько предложенных решений, но безуспешно.Я представляю, что это простая настройка или что-то, что требуется.Что мне нужно сделать, чтобы данные были успешно возвращены в формате json?

Ответы [ 3 ]

1 голос
/ 10 марта 2011

Я считаю, что эта проблема связана с самообращающимися классами. Из того, что я вижу как в приведенном выше сценарии, так и в попытке сохранить данные в изолированном хранилище на Windows Phone с помощью DataContractJsonSerializer, кажется, что JSON не обрабатывает сериализованные классы с циклическими ссылками.

0 голосов
/ 24 декабря 2015

У меня была та же проблема, моя служба wcf неправильно форматировала json при конвертации из набора данных в Json. Я получил это с помощью следующего решения:

using System.ServiceModel.Channels;
using System.ServiceModel.Web;

dsData - это мой набор данных

String JString = Newtonsoft.Json.JsonConvert.SerializeObject(dsData);
return WebOperationContext.Current.CreateTextResponse(JString, "application/json;charset=utf-8", System.Text.Encoding.UTF8);

и «Сообщение» будет типом возврата.

0 голосов
/ 06 марта 2014

Я знаю, что на этот вопрос уже был дан ответ, но ...

Я полагаю, это потому что ваш Customer не сериализуем. Это довольно просто исправить, просто создайте контракт данных, добавив тег [DataContract] к вашему классу Customer и тег [DataMember] к вашим (общедоступным) полям данных (которые вы хотите сериализовать).

[DataContract]
public class Customer {
    ...

    [DataMember]
    public int CustomerID; // this field will show up in the json serialization

    public string CustomerSIN; // this field will not

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...