禁用元数据交换而不使用web.config

时间:2015-07-20 18:30:12

标签: c# asp.net wcf

我正在开发一个将部署在客户端数据中心的单租户Web应用程序,出于安全考虑,我们希望禁用应用程序WCF服务上的元数据交换。是否可以在我们的服务应用程序或web.config之外的其他机制中以编程方式执行此操作?我们希望阻止更具技术头脑的客户端进入web.config并重新开启元数据交换。

2 个答案:

答案 0 :(得分:1)

您可以通过将HttpGetEnabled / HttpsGetEnabled设置为false来以编程方式禁用元数据交换。

首先,从ServiceHost创建一个派生主机。

 public class DerivedHost : ServiceHost
 {
    public DerivedHost( Type t, params Uri baseAddresses ) :
    base( t, baseAddresses ) 
    {
        DisableMetadataExchange();
    }

    private void DisableMetadataExchange()
    {
        var metadata = Description.Behaviors.Find<ServiceMetadataBehavior>();

        if metadata != null)
        {
            // This code will disable metadata exchange
            metadata .HttpGetEnabled = false; 
            metadata .HttpsGetEnabled = false; 
         }
    }
 }

第二,从ServiceHostFactory创建派生工厂。

public class DerivedFactory : ServiceHostFactory
{
   public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )
   {
      return new DerivedHost( t, baseAddresses );
   }
}

第三次,创建或编辑您的svc文件标记并应用派生的工厂。

<% @ServiceHost Factory=”DerivedFactory” Service=”MyService” %>

第四,在浏览器中测试您的服务,您应该会看到一条消息“目前已停用此服务的元数据发布”。

如果想了解有关此实施的更多详细信息,请访问此link

答案 1 :(得分:0)

是。如果您将WCF服务编码为&#34;自我描述&#34;,这基本上意味着使用WCF拦截层来处理到端点的所有传入请求,您只需从MEX请求返回null。

要使这项工作有点棘手,但根据我的经验,可以实现比所有那些庞大的web.config条目更清晰的实现。这在此处描述WCF Configuration without a config file