C# 扩展WCF服务

C# 扩展WCF服务,c#,wcf,extend,C#,Wcf,Extend,我的项目中有多个WCF服务,希望在不更改任何服务的情况下为所有这些服务添加一个新方法。可以用c#做吗 假设服务是 MyService1.svc MyService2.svc Myservice3.svc 现在我想向所有人公开一个名为“HealthyStatus()”的方法,以便客户机可以使用这个方法。此方法在另一个名为“HeathCheckerService.cs”的类中实现 我不想改变web服务,即没有基类技术 提前感谢。正如评论者所说,这是不可能的。除非向服务契约添加操作,否则无法扩展服务契

我的项目中有多个WCF服务,希望在不更改任何服务的情况下为所有这些服务添加一个新方法。可以用c#做吗

假设服务是

  • MyService1.svc
  • MyService2.svc
  • Myservice3.svc
  • 现在我想向所有人公开一个名为“HealthyStatus()”的方法,以便客户机可以使用这个方法。此方法在另一个名为“HeathCheckerService.cs”的类中实现


    我不想改变web服务,即没有基类技术


    提前感谢。

    正如评论者所说,这是不可能的。除非向服务契约添加操作,否则无法扩展服务契约,这意味着重新编译和重新部署服务

    实现所需功能的一种方法是使用名为HealthyStatus()的操作托管一个新的服务端点,然后该操作调用其他服务(以某种非侵入性方式)并返回状态。但这需要您的其他服务公开一个可以调用而不会产生后果的操作,以及您对健康状态的定义

    一些负载平衡器可以配置为提供http enpoints的运行状况监视,但是,这里的健康定义是流动的,可能不足以满足您的需要

    如果您愿意更新您的服务,那么最简单的做法可能是创建一个新的服务合同,如:

    [ServiceContract] 
    public interface IHealthCheckServiceContract
    {    
        [OperationContract]    
        int CheckStatus(); 
    }
    
    然后让您的所有其他服务合同实施:

    [ServiceContract] 
    public interface IMyService1 : IHealthCheckServiceContract
    { 
        ...    
    }
    
    [ServiceContract] 
    public interface IMyService2 : IHealthCheckServiceContract
    { 
        ...    
    }
    
    显然,通过这种方法,您可以对服务实现进行子类化

    public abstract class HealthChecker
    {
        public abstract int CheckStatus();
    }
    
    public class MyService1 : HealthChecker, IMyService1
    {
        public override int CheckStatus()
        {
            // MyService1 implementation of CheckStatus()
        }
    
        // Implementation of IMyService1 operations
        .....
    }
    
    public class MyService2 : HealthChecker, IMyService2
    {
        public override int CheckStatus()
        {
            // MyService2 implementation of CheckStatus()
        }
    
        // Implementation of IMyService2 operations
        .....
    }
    

    实际问题是什么?为什么不能修改服务?WCF服务类是服务,方法是操作。WSDL是从这些类和方法生成的。添加新操作意味着添加新方法。这是版本控制问题吗?“添加方法”意味着由于添加了新操作而破坏现有WSDL。您是否试图在不中断以前的客户端的情况下支持新操作?“我不想更改web服务,即没有基类技术”基类不会更改“web服务”,或者更确切地说,它只是通过在“web服务”上专门添加新方法来更改“web服务”@Aron-我的意思是我不想从基类继承,因为这意味着我不想更改web服务本身。回答您的问题时,是和否-这是版本控制问题吗?我希望能够添加一个新的方法,但有大约100个服务,所以不想去改变所有的服务…无论如何,这可以在不涉及所有100个服务的情况下实现吗?我很高兴重新组合和重新部署。很高兴添加一个可以附加到我所有100个服务的操作。但我不想去添加/更新我的所有服务。@user1108205请查看我的答案中的添加内容。你说的话听起来很神奇。如果你更新合同,你必须更新引用,你的客户必须知道你实现的新方法。@RicardoPontual-你错了。现有客户端将继续正常工作,无需更新。向现有服务契约中添加新操作对于客户端来说不是一个破坏性的更改。只有当他们想调用新操作时,才需要更新。@TomRedfern我的意思是,如果任何客户端需要使用新操作,他们必须更新引用,以便识别新操作并更改代码。如果客户端不需要调用新操作,那么您是对的,不需要更新引用。