代码之家  ›  专栏  ›  技术社区  ›  chilltemp

运行时停止/启动WCF MEX服务

  •  2
  • chilltemp  · 技术社区  · 15 年前

    是否可以/如何在运行时停止和启动自托管WCF服务的HTTP MEX侦听器而不影响主WCF服务?

    (请不要问我为什么要这样做。绕过别人强加的人为限制是一种黑客行为。)

    1 回复  |  直到 15 年前
        1
  •  3
  •   EnocNRoll - AnandaGopal Pardue    15 年前

    *****[在重新测试和代码清理之后重新添加此答案]这是我添加到基于WCF的通用服务开发框架中的实际代码,并且已经完全测试过了。*****

    假设您从启用MEX开始 ServiceHost

    以下解决方案写入 A的术语 服务宿主 子类 ( WCFServiceHost<T> )实现 一个特殊的接口( IWCFState 为 存储MEX的实例 EndpointDispatcher 班级。

    首先,添加这些命名空间…

    using System.ServiceModel;
    using System.ServiceModel.Dispatcher;
    

    其次,定义 IWCFCSTATE 界面…

    public interface IWCFState
    {
        EndpointDispatcher MexEndpointDispatcher
        {
            get;
            set;
        }
    }
    

    第三,为一些 服务宿主 扩展方法(我们将在下面填写它们)

    public static class WCFExtensions
    {
        public static void RemoveMexEndpointDispatcher(this ServiceHost host){}
    
        public static void AddMexEndpointDispatcher(this ServiceHost host){}
    }
    

    现在让我们填写扩展方法…

    在上停止MEX 服务宿主 在运行时

    public static void RemoveMexEndpointDispatcher(this ServiceHost host)
    {
        // In the simple example, we only define one MEX endpoint for
        // one transport protocol
        var queryMexChannelDisps = 
                host.ChannelDispatchers.Where(
                    disp => (((ChannelDispatcher)disp).Endpoints[0].ContractName
                                                == "IMetadataExchange"));
        var channelDisp = (ChannelDispatcher)queryMexChannelDisps.First();
    
        // Save the MEX EndpointDispatcher
        ((IWCFState)host).MexEndpointDispatcher = channelDisp.Endpoints[0];
    
        channelDisp.Endpoints.Remove(channelDisp.Endpoints[0]);
    }
    

    然后这样称呼它…

    // WCFServiceHost<T> inherits from ServiceHost and T is the Service Type,
    // with the new() condition for the generic type T.  It encapsulates 
    // the creation of the Service Type that is passed into the base class 
    // constructor.
    Uri baseAddress = new Uri("someValidURI");
    WCFServiceHost<T> serviceImplementation = new WCFServiceHost<T>(baseAddress);
    
    // We must open the ServiceHost first...
    serviceImplementation.Open();
    
    // Let's turn MEX off by default.
    serviceImplementation.RemoveMexEndpointDispatcher();
    

    在上重新启动mex 服务宿主 在运行时

    public static void AddMexEndpointDispatcher(this ServiceHost host)
    {
        var queryMexChannelDisps =
                host.ChannelDispatchers.Where(
                        disp => (((ChannelDispatcher)disp).Endpoints.Count == 0));
        var channelDisp = (ChannelDispatcher)queryMexChannelDisps.First();
    
        // Add the MEX EndpointDispatcher
        channelDisp.Endpoints.Add(((IWCFState)host).MexEndpointDispatcher);
    }
    

    然后这样称呼它…

    serviceImplementation.AddMexEndpointDispatcher();
    

    总结

    这种设计允许您使用一些消息传递方法向服务本身或承载服务的代码发送命令,并让它执行MEX的启用或禁用。 端点调度程序 ,有效地关闭了MEX 服务宿主 .

    注意:此设计假定代码在启动时支持MEX,但随后它将使用配置设置来确定服务在调用后是否将禁用MEX Open() 服务宿主 . 如果在 服务宿主 已打开。

    注意事项:我可能会创建一个特殊的服务实例,其管理操作在启动时不支持MEX,并将其建立为服务控制通道。

    资源

    我发现以下两种资源在解决这一问题时是必不可少的: