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