我在IIS中托管了WCF服务.目的是让客户进行调用并接收在另一个项目/ dll中定义的自定义类.我使用svcutil.exe生成了一个服务客户端.问题是这个自动生成的客户端包含我尝试从服务返回的类的新的部分/代理定义.它现在在编译时抛出我的原始自定义类和新的部分定义之间的转换错误.那么如何从WCF服务返回用户定义的类型?建议表示赞赏.
如果您要从服务调用返回的类型未标记为a,DataContract
那么在不向客户端应用程序提供该相同程序集的副本的情况下,您将无法从WCF返回该类型.
using System; using System.ServiceModel; [ServiceContract] interface IService { [OperationContract] TimeSpan GetTimeSpan(); } class Service : IService { public TimeSpan GetTimeSpan() { return DateTime.Now.TimeOfDay; } }
为什么之前的代码可以工作呢?它的工作原理是因为服务调用的两端都有,System.dll
所以他们都知道System.TimeSpan
类型是OperationContract的返回类型GetTimeSpan()
.
以下是使用以下示例DataContract
:
using System; using System.ServiceModel; using System.Runtime.Serialization; [ServiceContract] interface IService { [OperationContract] Contract GetContract(); } [DataContract] class Contract { [DataMember] public String MyProperty { get; set; } } class Service : IService { public Contract GetContract() { return new Contract(); } }
现在,您已为已定义的类提供了序列化属性(Contract
) - 这将允许您svcutil.exe
在客户端应用程序中创建将被序列化并发送到WCF服务的代理类.
现在,如果要返回非类型的类型,则DataContract
必须将包含该类型的程序集的副本提供给客户端应用程序.