当我返回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>
答案 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解释为什么通过线路传递匿名类型是一个坏主意。