【问题标题】:Upcasting ServiceContract上播服务合同
【发布时间】:2010-06-05 02:36:55
【问题描述】:

我有一个 WCF 服务,它公开了许多方法。

我的应用程序使用此服务,而 ServiceContract 仅包含一些方法的 OperationContract 定义。

要切入问题,请考虑以下代码示例:

[ServiceContract]
public interface IServer
{
    [OperationContract]
    void BasicOperation();
}

[ServiceContract]
public interface IExtendedServer : IServer
{
    [OperationContract]
    void ExtendedOperation();
}

我想签订合同,使应用程序具有扩展能力。换句话说,我希望能够在任何地方使用IServer合约,但允许类插件架构扩展基本合约接口,以便插件本身可以调用ExtendedOperation()操作合约。

那么,我该如何构建我的代码,或者,我必须进行哪些更改才能执行以下操作? (通道类型为 IServer)

((IExtendedServer)channel).ExtendedOperation()

当我尝试这样做时,我得到了错误

System.InvalidCastException:无法将透明代理转换为类型“Contract.IExtendedServer”。

希望我没有混淆...

【问题讨论】:

    标签: c# interface wcf wcf-client


    【解决方案1】:

    SOA 世界中的服务需要有一个定义良好且非常静态的接口。 SOAP 服务需要 WSDL 中的表示(并且包含或单独的 XSD = XML 模式用于所涉及的数据)。

    我不明白如何在服务世界中创建类似于插件系统的东西。插件在本地应用程序上工作得很好——加载你的资源、语言扩展、图形过滤器——任何你喜欢的东西。但在 SOA 世界中,这种“敏捷性”与您尝试做的完全相反——创建并提供定义明确、完全指定的服务以供使用。

    我能看到的唯一选择是使用基于 REST 的方法,因为您实际上并没有很多这些限制。通常我会说缺乏正式的服务描述是 REST 的主要缺点和弱点之一,但由于使用 REST,操作实际上只是由使用的 URL 定义的,这对你来说可能是一个加分。

    所以我想说:如果您真的想要服务的灵活性,您需要查看基于 REST 的服务。 SOAP 不符合这个要求。转到 MSDN 上的 WCF REST Developer Center,获取有关如何在 WCF 中使用 REST 的大量信息和资源。

    【讨论】:

    • +1 提供具有深思熟虑的推理的特定替代方案。
    • 谢谢。我自己的推理有点模糊,有一些想法,但似乎并没有坚持下去,尤其是在很好的解释之后。
    【解决方案2】:

    我不确定您要在这里完成什么。您正在处理具有暴露特定合同(即接口)的端点的服务。您不是在处理对象和铸造等;它不会起作用,而且无论如何都不是正确的方法。

    在我看来,您所拥有的确实就是这样:一种服务,它通过一组通用操作公开一个端点,并可能有 X 数量的附加端点以及具有扩展操作的其他合约。您仍然可以在服务端拥有一个服务类,但就客户端而言,它们只是不同的端点/服务。

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多