WCF 服务:app.config 与属性或两者的混合

Posted

技术标签:

【中文标题】WCF 服务:app.config 与属性或两者的混合【英文标题】:WCF service: app.config versus attributes or a mixture of both 【发布时间】:2011-10-09 07:40:43 【问题描述】:

在 WCF 应用程序中,我们有一个带有属性的服务契约:

namespace We.Work 
    [ServiceContract(Namespace = "We", Name = "IWork", SessionMode = SessionMode.NotAllowed)]
        public interface IWork

带有属性的服务契约的实现:

namespace We.Work 
    [ServiceBehavior(Name = "Work", Namespace = "We",
           IncludeExceptionDetailInFaults = true,
           InstanceContextMode = InstanceContextMode.PerCall,
           ConcurrencyMode = ConcurrencyMode.Multiple,
           ReleaseServiceInstanceOnTransactionComplete = false
        )]
        public class WorkImplementation : IWork

服务主机(用于开发的 Windows 服务或控制台应用程序)

namespace We.Host 
// ....
        workServiceHost = new ServiceHost(typeof(We.Work.WorkImplementation));
        workServiceHost.Faulted += new EventHandler(Host_Faulted);
        workServiceHost.Open();

最后但并非最不重要的一个 app.config:

<service behaviorConfiguration="WorkServiceBehaviour" name="We.Work.WorkImplementation">
        <endpoint behaviorConfiguration="WorkEndPointBehaviour" binding="wsHttpBinding" bindingConfiguration="WorkWsHttpBindingConfig" name="WorkEndPoint" contract="We.Work.IWork"/>
        <host> <baseAddresses> <add baseAddress="http://.../Work.svc"/>            </baseAddresses> </host>
      </service>

<behaviors>
      <endpointBehaviors>
        <behavior name="WorkEndPointBehaviour">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="WorkServiceBehaviour">
          <serviceDebug httpHelpPageEnabled="true" httpsHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceMetadata/>
          <serviceThrottling maxConcurrentCalls="25" maxConcurrentSessions="25" maxConcurrentInstances="25"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

问题: 是否可以混合 app.config 和属性,哪个配置优先,什么是好的做法?

例如ServiceContract(SessionMode = SessionMode.NotAllowed) 会阻止 wsHttpBinding 使用会话吗?

[已回答:我如何确定 app.config 中的设置真正得到应用——完全限定名称有效。]

【问题讨论】:

【参考方案1】:

配置文件中的服务名称属性必须是服务类的完全限定名称,WCF 才能自动获取配置。

可以混合配置和代码。但是,没有这样的优先级。当您实例化ServiceHost 时,WCF 将读取配置文件。如果您想在代码中设置其他属性,它们将覆盖已经存在的内容。

最佳做法完全取决于您。配置文件元素的目的是解耦服务配置和实现,这可能会或可能不会在您的部署中考虑。

更新

服务类代码的属性是另一回事。某些属性的目的是让开发者说“我要求配置与该属性一致,否则我的服务将无法按设计运行”。因此,虽然属性实际上不会覆盖配置,但 WCF 会检查配置与属性是否一致,如果不一致则拒绝启动服务。

【讨论】:

代码否决设置,这也是 w.r.o.属性,即当我使用属性时,我的 app.config 会被忽略吗? 感谢您解决这个问题!我现在看到我的下一个问题是:ServiceThrottling 的 SessionMode.NotAllowed 和 maxConcurrentSessions 有什么区别?两者都可以与 wshttpbinding 同时使用。

以上是关于WCF 服务:app.config 与属性或两者的混合的主要内容,如果未能解决你的问题,请参考以下文章

从类库调用 WCF 服务:App.Config 与 Web.Config?

WCF - 在单个 APP.Config 文件中定义多个服务?

使用 App.Config 在 Windows 服务中的 WCF 命名管道

在带有 WCF 的 App.config 中使用 Windows 角色身份验证

在 app.config 文件中配置 wcf 超时 [重复]

WCF C# - 从 App.config 获取特定的配置值