如何以编程方式添加端点的ServiceDebug行为?

时间:2014-01-29 21:46:53

标签: c# .net wcf web-services

我正在开发一个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完成此任务,为什么我不能以编程方式完成此任务?

1 个答案:

答案 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;