【问题标题】:WCF ServiceHost already has 5 behaviorsWCF ServiceHost 已经有 5 个行为
【发布时间】:2010-02-16 13:18:08
【问题描述】:

我正在创建一个 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 怎么办?

提前致谢,

【问题讨论】:

    标签: c# wcf service


    【解决方案1】:

    不容易 - 我知道没有设置可以将其关闭。问题真的是:你从中得到什么好处?

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

    但是,如果您真的想这样做,您可以随时创建自己的 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 已经存在,您可以找到它并将属性设置为 true - 否则您将创建并添加一个新的 ServiceDebugBehavior。很简单,我想。

    【讨论】:

    • Weel 我没有抱怨你所说的行为,比如身份验证和服务凭证。但是,我认为将 DebugBehavior 包含在包中很奇怪。我不想在我的生产服务上暴露这种行为。根本没有 DebugBehavior 的意义吗?它允许您在有意义时插入它。那么这是 WCF 的预定义行为吗?
    • 是的,但是ServiceDebugBehavior 上的IncludeExceptionDetailsInFaults 设置默认关闭!也是故意的 - 这是一件好事!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      相关资源
      最近更新 更多