【问题标题】:WCF Service - JSON - No Data ReturnedWCF 服务 - JSON - 未返回数据
【发布时间】:2010-12-06 14:47:03
【问题描述】:

我有一个基于实体框架 POCO 类的简单原型 WCF 服务。当我在未指定响应格式的情况下运行其中一种公开方法时,它会将 XML 格式的预期数据返回给浏览器。但是,如果我指定“ResponseFormat = WebMessageFormat.Json”,则不会向浏览器返回任何数据。如果我尝试使用 Fiddler 查看更多信息,我会发现对浏览器的响应是“ReadResponse() failed: The server did not return a response for this request.”。

这是服务合同:

 [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格式的数据?

【问题讨论】:

  • 您可以发布服务合同或至少发布您正在使用的方法吗?你也可以发布那个服务方法的实现吗?

标签: json wcf


【解决方案1】:

我相信这个问题与自引用类有关。从我在上面的场景中可以看到,在尝试使用 DataContractJsonSerializer 将数据存储在 Windows Phone 上的独立存储中时,似乎 JSON 不处理带有循环引用的序列化类。

【讨论】:

    【解决方案2】:

    我知道这个问题已经回答了,但是...

    我相信这是因为您的 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
    
        ...
    }
    

    【讨论】:

      【解决方案3】:

      我有同样的问题,我的 wcf 服务在将它从 Dataset 转换为 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);
      

      并且“消息”将是返回类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多