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

Disable metadata exchange without using web.config

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

是的。如果您将 WCF 服务编码为 "self describing",这基本上意味着使用 WCF 拦截层来处理对端点的所有传入请求,您可以从 MEX 请求中直接 return null。

完成这项工作有点棘手,但根据我的经验,与所有那些冗长的 web.config 条目相比,它的实现更加简洁。这在此处描述 WCF Configuration without a config file

您可以通过将 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” %>

第四,在浏览器中测试您的服务,您应该会看到包含 "Metadata publishing for this service is currently disabled".

的消息

如果需要有关此实现的更多详细信息,请访问此 link