【问题标题】:Generating WCF Proxy to Server Interface生成 WCF 代理到服务器接口
【发布时间】:2009-10-11 11:07:17
【问题描述】:

我正在为我的合同生成 WCF 代理。 合约包含实现接口的类。 在生成的代理上,接口消失了。 所以我不能使用它。

有没有办法以某种方式标记要在代理文件上生成的接口?

这是一个联系示例:

public interface IMyGeneralInterface
{    
   int? ID { get; set; }
}

[DataContract]
public abstract class EntityBase : IMyGeneralInterface
{        
  [DataMember]
  public virtual int? ID { get; set; }
}

生成的代理将不包含任何 IMyGeneralInterface 的定义,这将使我无法在客户端使用它。

我该怎么办?

谢谢, 丹妮

【问题讨论】:

    标签: wcf


    【解决方案1】:

    客户端和服务器之间交换的消息必须是具体类,可以在发送方和接收方之间进行序列化和反序列化。这使得来回发送接口几乎是不可能的。重要的是:您在客户端和服务器之间交换消息 - 不是 具有信息和行为的对象。

    客户在导入服务描述时看到的只是“EntityBase”类型的数据合同——他看不到其他任何东西。数据以 XML 模式描述,而 XML 模式没有有接口的概念。

    记住:WCF 是可互操作的 - 您的客户端可能是 PHP 或 Java 客户端,它们可能不支持接口的概念。

    如果您控制服务的两端(服务器和客户端),您可以做的唯一一件事就是将您的服务和数据合同放入它们自己的程序集中,然后在客户端之间共享该程序集和服务器。这样,您可以在客户端和服务器之间“传输”有关您的服务和数据合同的更多信息,但是您在此过程中失去了任何互操作性的机会。

    有关在 WCF 客户端和服务器之间共享程序集的更多信息,请参阅这些博客文章:

    马克

    【讨论】:

    • 嗨,Marc,我们使用了这种方法,但它给我们带来了一些问题,因为我们通过 WCF 传递的所有集合都变成了数组(因此我们无法向它们添加任何东西)。所以解决方案是使用生成的代理(它解决了这个问题),现在我正在努力将生成的人员与共享的 dll 分开,这里我们使用接口。我在想我们也许可以将它们保留在共享 dll 中(因为我们不需要互操作性,并尝试在同一个解决方案中混合生成的代理文件和共享 dll。
    • 嗯,这是另一回事:基本上,所有支持“集合”的 XML 模式都是数组——在 XML 模式中没有别的东西。但是你可以指定(当你创建你的代理时)你想放弃这个限制并使用集合或通用列表——同样,失去了一些互操作性,但让纯 .NET 开发商店的事情变得更容易。查看“添加服务参考”屏幕上的各种选项(或 svcutil.exe 的命令行选项)
    【解决方案2】:

    如果您确实需要在生成的代理类型上实现接口,另一种方法是对生成的类型进行部分分类。我相信标准生成的代理类通常被标记为部分和公共。

    public partial class GeneratedType : IMyGeneralInterface {}
    

    当然,您最终仍然必须与客户端和服务器端程序集共享您的界面,因此这不会解决您在上一个答案中所说的互操作性问题,也不会免费生成,但有时它可以是有用。

    我总是喜欢将共享接口保存在一个单独的程序集中,而不是任何服务器端对象的程序集中,以避免从服务到客户端共享类型(否则我觉得这很混乱)。

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      相关资源
      最近更新 更多