C# WCF ServiceHost已具有5种行为

C# WCF ServiceHost已具有5种行为,c#,wcf,service,C#,Wcf,Service,我正在创建一个ServiceFactory来控制通过IIS 7公开的服务的非专业化 然而,我对ServiceHost的行为感到惊讶。尽管我有0个服务配置文件,但无论我在何处初始化新ServiceHost,如下所示: var host = new ServiceHost(typeof(MyService), baseAddresses); 接下来,我只想在生成处于调试模式时添加一些行为: #if DEBUG host.Description.Behaviors.Add(new ServiceDe

我正在创建一个ServiceFactory来控制通过IIS 7公开的服务的非专业化

然而,我对ServiceHost的行为感到惊讶。尽管我有0个服务配置文件,但无论我在何处初始化新ServiceHost,如下所示:

var host = new ServiceHost(typeof(MyService), baseAddresses);
接下来,我只想在生成处于调试模式时添加一些行为:

#if DEBUG
host.Description.Behaviors.Add(new ServiceDebugBehavior());
#endif
但是,此代码失败,因为ServiceDebugBehavior已应用!尽管我没有配置文件,也没有应用于服务类的属性,但主机已经应用了此行为,并且应用了5个以上的行为

这是预期的行为吗?如果我想在发布版本上禁用ServiceDebugBehavior怎么办


提前感谢,

不容易-我知道没有设置可以关闭此功能。问题是:你们从中得到了什么好处

在我看来,这些行为中的大多数都是非常重要的——身份验证和服务凭据等等。如果它们默认存在,即使没有配置,我相信它们存在是有原因的

但是如果你真的想,你可以创建你自己的
CustomServiceHost
,在这个类中做任何你想做的事情,包括抛弃所有预定义的行为,如果你想的话

例如,如果要启用服务调试行为的
IncludeExceptionDetailsInFaults
设置,请尝试以下类型的代码:

ServiceDebugBehavior behavior = 
       host.Description.Behaviors.Find<ServiceDebugBehavior>();

if(behavior != null)
{
    behavior.IncludeExceptionDetailInFaults = true;
}
else
{
    host.Description.Behaviors.Add(
        new ServiceDebugBehavior() { IncludeExceptionDetailInFaults = true });
}
ServiceDebugBehavior行为=
host.Description.Behaviors.Find();
if(行为!=null)
{
behavior.IncludeExceptionDetailInFaults=true;
}
其他的
{
host.Description.Behaviors.Add(
新的ServiceDebugBehavior(){IncludeExceptionDetailInFaults=true});
}

在本例中,如果已存在
ServiceDebugBehavior
,则找到它并将属性设置为true,否则将创建并添加新的
ServiceDebugBehavior
。我认为这很简单。

您不应该在#if debug中创建服务调试行为,而应该只设置要更改默认属性的值。

Weel我对您所说的行为没有任何抱怨,例如身份验证和服务凭据。然而,我认为将调试行为包含在包中是很奇怪的。我不想在我的生产服务上公开这种行为。也不是说有一个调试行为的意义吗?它允许你在有意义的时候插上插头。这是WCF的预定义行为吗?是的,但是默认情况下,
ServiceDebugBehavior
上的
IncludeExceptionDetailsInFaults
设置被关闭!也是故意的——这是一件好事!