从服务中返回json对象

时间:2015-04-27 09:37:10

标签: c# json wcf

当我返回Employee类时工作正常,但我只需要几个属性,所以我试图让它像这样工作,在浏览器上获取ERR_CONNECTION_REFUSED但后面的代码没有错误。

    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "employees")]
    public object GetEmployees()
    {
        var c = Employee.GetList().Select(x => new { id = x.Id, title = x.Title, person = x.FullName});
        return c;
    }


   [OperationContract]
    object GetEmployees();

WebConfig

  <service name="FOO.FOO.FOOService">
    <endpoint address="http://localhost:8733/FOOService" binding="webHttpBinding" contract="FOO.FOO.IFOOService" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8733/FOOService" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior>
      <webHttp />
    </behavior>
  </endpointBehaviors>

2 个答案:

答案 0 :(得分:3)

您不能将匿名类型与默认WCF序列化程序一起使用。如果要支持匿名类型,则必须创建自定义消息格式化程序(https://msdn.microsoft.com/en-us/library/ms733844.aspx)。

在您的情况下,我建议创建EmployeeDTO(员工数据传输对象)类型,其中包含您要从服务返回的字段。然后,您可以将此类型用作GetEmployees方法的返回类型。

答案 1 :(得分:0)

如果你真的不想创建一个我喜欢的数据传输对象,那么我建议从服务中返回Dictionary<string,string>个对象的列表。虽然有一些方法可以使WCF序列化与非类型化对象一起使用,但它们都不可维护或优雅。使用词典可以在没有这些问题的情况下为您提供相同的灵活性。

然后您的代码可以重写为:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "employees")]
public List<Dictionary<string, string>> GetEmployees()
{
    var c = Employee.GetList().Select(x => new Dictionary<string, string> {{"id", x.Id.ToString()}, {"title",x.Title}, {"person", "x.FullName"}}).ToList();
    return c;
}

不要忘记将字典的结果强制转换回客户端上所需的类型。 我还建议你看一下这个问题的答案: Passing an instance of anonymous type over WCF解释为什么通过线路传递匿名类型是一个坏主意。