如何从 WCF 服务返回用户定义的类型?
-
22-07-2019 - |
题
我有一个托管在 IIS 中的 WCF 服务。目的是让客户端进行调用并接收在另一个项目/dll 中定义的自定义类。我已经使用 svcutil.exe 生成了一个服务客户端。问题是这个自动生成的客户端包含我尝试从服务返回的类的新部分/代理定义。现在,它在编译时在我的原始自定义类和新的部分定义之间引发转换错误。那么如何从 WCF 服务返回用户定义的类型呢?感谢建议。
解决方案
- 是的,您可以添加对共享dll的引用(而不是使用生成的代理类)
- 是的,它违背了数据契约的很多意图,如果发生任何类型的自定义序列化,您可能会在扩展服务时遇到问题
我以前曾走过这条路,但在某些方面我希望我没有走这条路。可扩展性/自定义序列化 - 你必须 非常 小心。如果您使用预滚动序列化器,例如 protobuf网络 (它可以直接集成到 WCF 中,并且在设计时考虑了可扩展性),但并不容易。
其实,一 优势 共享类的好处是它使测试变得更容易:因为你有同样的 IFoo
在任何地方,你都可以嘲笑它 IFoo
有合理的成功机会。当涉及代理时,模拟会更困难(因为您在测试代码和生产代码之间更改了更多移动部分)。
其他提示
如果您想从您的服务请求未标以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
您必须提供包含类型的客户端应用程序组件的副本。
一的,将需要发生的事情是,用户必须配置服务引用从DLL,而不是由代理定义的类中使用你的类型 - 的 http://msdn.microsoft.com/en-us/library/bb628653.aspx
我们已经走过了过去这条道路,而事实上这个问题,当然,这是两个不同的类,所以你必须遵循@Rich路透社提供的链接;
我们有,虽然深知这一点,为什么这是不好的做法,因为它去agains SOA-“服务共享模式和契约,而不是一流的。”
的第三个原则当然,问题不只是没有遵循“规则”由某人在某个点设置,但有这个伟大的理由来建议 - 我们已经了解到,这种紧耦合的价格服务和之间客户端设备是非常难以释放或者 - 如果服务需要另一个字段添加到类,以服务其他客户端 - 第一个客户端可能会受到影响;如果不是需要服务于该类定义改变的东西(来服务其他客户端) - 第一个客户端将再次受到影响,反之亦然 - 客户端可能会影响到服务的整个生命周期。
在大型项目中这很快成为一个庞大的维护负担。