Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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 MEX服务_C#_C# 3.0_Wcf - Fatal编程技术网

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

C# 在运行时停止/启动WCF MEX服务,c#,c#-3.0,wcf,C#,C# 3.0,Wcf,是否可能/如何在运行时停止和启动自托管WCF服务的HTTP MEX侦听器而不影响主WCF服务 (请不要问我为什么要这样做。这是一种绕过别人强加的人为限制的黑客行为。)******[在重新测试和代码清理后重新添加此答案]这是我添加到基于WCF的通用服务开发框架中的实际代码,并且已经过全面测试***** 假设您首先在服务主机上启用MEX 下面的解决方案是用 ServiceHost子类的术语 (WCFServiceHost)实现 专用接口(IWCFState)用于 存储MEX的一个实例 Endpoin

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


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

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

假设您首先在
服务主机上启用MEX

下面的解决方案是用
ServiceHost
子类的术语 (
WCFServiceHost
)实现 专用接口(
IWCFState
)用于 存储MEX的一个实例
EndpointDispatcher
class

首先,添加这些名称空间

using System.ServiceModel;
using System.ServiceModel.Dispatcher;
其次,定义
IWCFState
接口

public interface IWCFState
{
    EndpointDispatcher MexEndpointDispatcher
    {
        get;
        set;
    }
}
第三,为一些
ServiceHost
扩展方法创建一个静态类(我们将在下面填充它们)

现在让我们填写扩展方法

在运行时在
服务主机上停止MEX
那就这样称呼它吧

// 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();
serviceImplementation.AddMexEndpointDispatcher();
那就这样称呼它吧

// 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();
serviceImplementation.AddMexEndpointDispatcher();
总结 此设计允许您使用一些消息传递方法向服务本身或承载服务的代码发送命令,并让它执行MEX
EndpointDispatcher
的启用或禁用,从而有效地关闭该
ServiceHost
的MEX

注意:此设计假定代码在启动时支持MEX,但随后将使用配置设置来确定服务在调用
ServiceHost
上的
Open()
后是否将禁用MEX。如果在打开
ServiceHost
之前尝试调用任一扩展方法,则此代码将抛出

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

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

  • .NET Reflector:用于检查System.ServiceModel.dll等程序集的类浏览器、分析器和反编译器:

  • 扩展Dispatchers(MSDN):提供了WCF服务类组成的高级图表:


您将在何处执行此操作?在你自己的主机代码中?在什么情况下?应该是在自助服务中。只要满足内部参数,就会发布一个带有代码的简单但完整的答案。重新添加带有固定代码的答案,并更好地解释其假设。我对我的解决方案并不完全满意:1)我不喜欢只假设1个EndpointDispatcher并指定ContractName,而不是比较类型;2) 我不喜欢假设MEX ChannelDispatcher有0个端点,并且它是唯一这样的ChannelDispatcher。我也不喜欢扩展方法本身,因为需要将强制转换嵌入IWCFSTate。因此,我可以将它们移到我的WCFServiceHostUtils静态类中。谢谢,这非常有用。我对我的版本做了一些修改,以支持多个Mex端点,并且它可以按照需要工作。我很高兴!如果您有任何指向可能对您有进一步帮助的资源的链接,比如关于支持多个Mex端点的方法,我很乐意看到这一点。干杯我很确定我的“2个Mex端点”只不过是我学习WCF的产物。实际上只有1个Mex地址被公开。
serviceImplementation.AddMexEndpointDispatcher();