Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 扩展WCF服务及其自动生成的客户端服务引用_C#_.net_Wcf_Wcf Client - Fatal编程技术网

C# 扩展WCF服务及其自动生成的客户端服务引用

C# 扩展WCF服务及其自动生成的客户端服务引用,c#,.net,wcf,wcf-client,C#,.net,Wcf,Wcf Client,我对.Net和C#开发相对较新,在将WCF服务从应用程序解耦到我正在创建的网络DLL时遇到了一个问题。DLL的目标是提供一种从服务器和客户端应用程序托管和访问服务的简单方法,并在基本服务中添加一些心跳和自动重新连接功能,而无需每个应用程序在其WCF服务中指定心跳方法,也无需让应用程序管理自动连接的计时器重新连接 DLL提供具有以下目标的ServiceServer和ServiceClient类: ServiceServer: 创建并管理ServiceHost实例 从DLL外部托管服务(作为泛型传

我对.Net和C#开发相对较新,在将WCF服务从应用程序解耦到我正在创建的网络DLL时遇到了一个问题。DLL的目标是提供一种从服务器和客户端应用程序托管和访问服务的简单方法,并在基本服务中添加一些心跳和自动重新连接功能,而无需每个应用程序在其WCF服务中指定心跳方法,也无需让应用程序管理自动连接的计时器重新连接

DLL提供具有以下目标的ServiceServer和ServiceClient类:

ServiceServer

  • 创建并管理
    ServiceHost
    实例
  • 从DLL外部托管服务(作为泛型传递)
  • 向要承载的服务添加心跳操作,以及所有客户端/服务器应用程序共有的其他操作
ServiceClient

  • 创建并使客户端应用程序可以使用客户端服务引用。服务引用(自动生成)也作为泛型从应用程序传递
  • 将heartbeat方法添加到客户端的服务引用中,以及所有客户端/服务器应用程序共有的其他操作
  • 使用定时器或类似装置自动重新连接
到目前为止,我尝试使用分部类、泛型和静态扩展方法,但没有成功。问题是为了使我的DLL完全解耦,我使用泛型获取并创建服务引用和服务;我无法使用任何这些方法扩展收到的泛型类型


我基本上是在尝试使用其他方法扩展客户机服务引用,以便能够发送心跳等,而不需要另一个独立的连接和服务(这将使心跳无效),并且客户机应用程序不必知道任何有关发送心跳和自动重连的信息。同样,我想扩展服务器类作为参数接收的服务,以添加操作和服务器心跳代码的实现,并最终添加所有应用程序方法的其他通用方法。

不,它不会以这种方式工作

定义服务时,首先创建一个或多个服务契约(最佳实践是使用接口)。服务契约接口必须用ServiceContract属性标记,服务中使用的每个公开方法必须用OperationContract属性标记。然后创建实现这些接口的服务类。此类类可以公开为WCF服务,每个接口都有端点(服务契约)


没有其他办法奏效。您不能添加扩展方法、使用泛型或任何其他方法来“扩展”实现的服务。您可以继承现有的服务类并添加额外的接口。显然,除非您创建一些非常高级的代码以在运行时生成动态数据类型(=在运行时发出MSIL),否则这不是代码解决方案。

您可能希望探索此解决方案,以便在wcf服务中自动实现hearbeats

该解决方案还为客户端提供了一种扩展方法

谢谢
巴勃罗。

感谢您抽出时间回答这个问题。我感到惊讶的是,没有一种简单的方法可以将WCF代码与应用程序解耦,或者在一个端点上同时承载两个服务。我想我会忘记这个想法的。看看巴勃罗的答案,看起来我错了,有一个解决方案可以将“操作”添加到现有的服务中。