4

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の設定が実際に適用されていることを確認するにはどうすればよいですか?完全修飾名が機能します。]

4

1 に答える 1

5

構成ファイルのサービス名属性は、WCFが構成を自動的に取得するためのサービスクラスの完全修飾名である必要があります。

設定とコードを混在させることができます。ただし、そのような優先順位はありません。をインスタンス化すると、WCFは構成ファイルを読み取りますServiceHost。コードに追加のプロパティを設定する場合、それらはすでに存在するものを上書きします。

ベストプラクティスは完全にあなた次第です。構成ファイル要素の目的は、サービスの構成と実装を分離することです。これは、デプロイメントで考慮される場合とされない場合があります。

アップデート

サービスクラスコードの属性は別の話です。一部の属性の目的は、開発者に「この属性と一致する構成を要求します。そうしないと、サービスが設計どおりに実行されない」と言わせることです。したがって、属性は実際にはconfigをオーバーライドしませんが、WCFはconfigが属性と整合性があることを確認し、整合性がない場合はサービスの開始を拒否します。

于 2011-07-20T11:29:47.180 に答える