Служба WCF: app.config против атрибутов или смесь обоих - PullRequest
4 голосов
/ 20 июля 2011

В приложении 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 Ответ

5 голосов
/ 20 июля 2011

Атрибут имени службы в файле конфигурации должен быть полностью определенным именем класса службы для WCF, чтобы автоматически подобрать конфигурацию.

Можно смешивать конфигурацию и код.Тем не менее, нет приоритета как такового.WCF прочитает файл конфигурации, когда вы создадите экземпляр ServiceHost.Если вы хотите установить дополнительные свойства в коде, они перезапишут то, что уже есть.

Наилучшая практика полностью зависит от вас.Назначение элементов файла конфигурации состоит в том, чтобы отделить конфигурацию и реализацию службы, что может или не может учитываться при развертывании.

ОБНОВЛЕНИЕ

Атрибуты накод класса обслуживания это отдельная история.Цель некоторых атрибутов состоит в том, чтобы позволить разработчику сказать: «Мне требуется конфигурация, соответствующая этому атрибуту, иначе моя служба не будет работать так, как задумано».Поэтому, хотя атрибуты не будут переопределять конфигурацию, WCF проверит, что конфигурация совместима с атрибутами, и откажется запускать службу, если они не согласованы.

...