上传ServiceContract

我有一个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'。

我希望我不会感到困惑......


SOA世界中的服务需要有一个定义良好且相当静态的接口。 SOAP服务需要在WSDL中进行表示(并且为涉及的数据包含或分开XSD = XML模式)。

我没有看到如何在服务世界中创建类似插件系统的东西。 插件在本地应用程序上运行良好 - 加载资源,语言扩展,图形过滤器 - 无论您的想象如何。 但在SOA世界中,这种“敏捷性”与您正在尝试做的事完全相反 - 创建并提供定义明确的完全指定的服务以供使用。

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

所以我会说:如果你真的想要服务的灵活性,你需要检查基于REST的服务。 SOAP不适合该账单。 访问MSDN上的WCF REST开发人员中心,获取有关如何在WCF中使用REST以及如何使用REST的大量信息和资源。


我不确定你想在这里完成什么。 你正在处理的服务有端点暴露特定的合约(即接口)。 你不是在处理物体和铸造等等。 它不会起作用,反正也不是正确的做法。

我看到它的方式的确如此:一种服务,它向一个端点提供一组通用操作,并且可能有X个附加端点和其他带有扩展操作的合同。 您仍然可以在服务端拥有单个服务类,但就客户端而言,它们只是不同的端点/服务。

链接地址: http://www.djcxy.com/p/62571.html

上一篇: Upcasting ServiceContract

下一篇: Selenium Tests in an Embedded QT Browser