我正在开发一个Windows服务来托管各种项目的WCF服务。使用以下app.config
片段:
<system.serviceModel>
<services>
<service name="MyWcfService" behaviorConfiguration="MetaDataBehavior">
<endpoint contract="MyWcfService" binding="wsHttpBinding" address="" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MetaDataBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</bindings>
</system.serviceModel>
我可以在我的服务中的同一网址上公开股票服务“帮助”页面和WSHttpBinding
,如下所示:
ServiceHost myServiceHost = new ServiceHost(typeof(MyWcfService), new Uri(serviceAddress));
myServiceHost.Open()
然后我可以打开网络浏览器并转到,例如http://host:8001/services/MyWcfService
,我看到了标准的WCF帮助页面,所以我知道该服务正在运行。 (目前,让我们忽略暴露帮助页面的安全隐患。)我还可以访问同一网址上的WSHttpBinding
端点 。
我们现在已经成长为在此服务中托管了许多WCF服务,因此我正在通过以编程方式向ServiceHost
对象添加端点来简化配置。这一切都可以正常使用myServiceHost.AddServiceEndpoint()
。
我无法以编程方式获得的最后一篇文章是在与ServiceDebug
相同的网址上启用WSHttpBinding
行为。我有以下内容:
ServiceDebugBehavior sdb = myServiceHost.Description.Behaviors.Find<ServiceDebugBehavior>();
if (sdb == null)
{
sdb = new ServiceDebugBehavior()
{
HttpHelpPageEnabled = true,
IncludeExceptionDetailInFaults = true
};
myServiceHost.Description.Behaviors.Add(sdb);
}
else
{
sdb.HttpHelpPageEnabled = true;
sdb.IncludeExceptionDetailInFaults = true;
//sdb.HttpHelpPageUrl = new Uri(serviceAddress +"/help");
}
ServiceEndpoint endpoint = new ServiceEndpoint(contract, new WSHttpBinding, new EndpointAddress(new Uri(serviceAddress)));
myServiceHost.AddServiceEndpoint(endpoint);
有效,只要我a)更改帮助页面的地址(如上所述),或b)更改WSHttpBinding
侦听的URI。从概念上讲,这是有道理的:.NET不希望有两个端点监听同一个URI。
我的问题是我必须保持与使用此服务的现有应用程序的兼容性,这意味着我的端点地址无法更改。如果我可以通过app.config
完成此任务,为什么我不能以编程方式完成此任务?
答案 0 :(得分:2)
您实际上无法将ServiceDebugBehavior添加到ServiceHost,您需要做的是修改现有的ServiceDebugBehavior(具有相同的问题)
实施例
svcHost = new ServiceHost(typeof(MyService), adrbase);
// Configure Your Service
// Now for the ServiceDebugBehavior you want to modify (Example disable HTTP Help Page)
svcHost.Description.Behaviors.Find<ServiceDebugBehavior>().HttpHelpPageEnabled = false;