我有一个托管在 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-“服务共享模式和契约,而不是一流的。”

的第三个原则

当然,问题不只是没有遵循“规则”由某人在某个点设置,但有这个伟大的理由来建议 - 我们已经了解到,这种紧耦合的价格服务和之间客户端设备是非常难以释放或者 - 如果服务需要另一个字段添加到类,以服务其他客户端 - 第一个客户端可能会受到影响;如果不是需要服务于该类定义改变的东西(来服务其他客户端) - 第一个客户端将再次受到影响,反之亦然 - 客户端可能会影响到服务的整个生命周期。

在大型项目中这很快成为一个庞大的维护负担。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top