【发布时间】:2011-01-23 09:50:52
【问题描述】:
WCF 应用程序的任何方法如何将自定义集合返回到调用环境。 请帮助提供示例代码。
谢谢。
【问题讨论】:
WCF 应用程序的任何方法如何将自定义集合返回到调用环境。 请帮助提供示例代码。
谢谢。
【问题讨论】:
首先,您需要将接口定义为ServiceContract,并将返回自定义集合的方法定义为OperationContract。我会给你VB.net中的代码,bus很容易翻译成c#
Imports System.ServiceModel
<ServiceContract()>
Public Interface IClientContract
<OperationContract()>
Function GetClientList() As IList(Of POCOClients)
End Interface
这里,IList(of POCOClients) 是自定义集合。然后,实现接口。
Public Class ClientContractImplementation
Implements IClientContract
Private ClientOp As IClientsOperations
Sub New()
'I use a IoC container here, but you can make a standar New() at this point'
ClientOp = BLIoC.Container.Resolve(Of IClientsOperations)()
End Sub
Public Function GetClientList() As System.Collections.Generic.IList(Of ServiceLayerContract.POCOClients) Implements ServiceLayerContract.IClientContract.GetClientList
Return ClientOp.SearchClients()
End Function
End Class
然后,您需要在 Service.ServiceModel 部分配置 app.config 以公开 WCF 服务:
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" name="MEX" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:81/Client"/>
</baseAddresses>
</host>
现在,当客户端调用服务时,将返回 IList(Of POCOClients)(或任何您想要的)的自定义集合。
【讨论】:
除非我是 msitaken,否则很大程度上取决于您是在客户端使用 核心生成的代理,还是使用程序集共享(在服务器和客户端使用相同的代码)。使用代理 - 简单地说:你不能 - 它们是只是代表公共状态的浅层对象。您在 mex/wsdl 中拥有的只是“一组 X 类型的项目”,代码生成层将其解释为(取决于您的配置)List<T>、ObservableCollection<T> 等。
如果您使用程序集共享,您应该已经在客户端拥有正确的类型,因此它应该可以正常工作 - 但这在抽象方面不那么纯粹。最好避免在公共 API 上使用,但对于共享平台的内部应用则很好。
【讨论】: