Обмен настройками WCF между сервисом и клиентом - PullRequest
3 голосов
/ 15 декабря 2009

Могут ли службы и клиент WCF использовать одни и те же настройки (из одного и того же файла конфигурации) для привязок и т. Д., Что бы там ни было? Другими словами, могу ли я написать один раздел привязок и вставить что-нибудь и быть уверенным, что это хорошо для сервиса и клиента?

Я объясню лучше. У меня есть файл конфигурации, как это:

<services>
  <service name="TestClass1">
    <endpoint binding="basicHttpBinding" address="http://dev00:4322/host1/TestApplication1" contract="myApp.Interface.ITestApplication"/>
    <endpoint binding="netTcpBinding" bindingConfiguration="Binding1" address="net.tcp://dev00:4321/host1/TestApplication1" contract="myApp.Interface.ITestApplication"/>
    <endpoint binding="netNamedPipeBinding" address="net.pipe://localhost/host1/TestApplication1" contract="myApp.Interface.ITestApplication"/>
  </service>

  <service name="ManagementClass1">
    <endpoint binding="netNamedPipeBinding" address="net.pipe://localhost/host1/ManagementApplication1" contract="myApp.Interface.IManagementApplication"/>
    <endpoint binding="netTcpBinding" bindingConfiguration="Binding1" address="net.tcp://dev00:4321/host1/ManagementApplication1" contract="myApp.Interface.IManagementApplication"/>
  </service>
</services>

<client>
  <endpoint name="clientTestClass1Tcp"
      address="net.tcp://dev00:4321/host1/TestApplication1"
      binding="netTcpBinding" 
      bindingConfiguration="Binding1" 
      contract="myApp.Interface.ITestApplication"/>

  <endpoint name="clientManagementClass1Tcp"
      address="net.tcp://dev00:4321/host1/ManagementApplication1"
      binding="netTcpBinding" 
      bindingConfiguration="Binding1" 
      contract="myApp.Interface.IManagementApplication"/>
</client>

<bindings>
  <netTcpBinding>
    <binding name="Binding1" 
         closeTimeout="00:00:10"
         openTimeout="00:00:10" 
         receiveTimeout="00:01:00" 
         sendTimeout="00:01:00"
         transactionFlow="false" 
         transferMode="Buffered" 
         transactionProtocol="OleTransactions"
         hostNameComparisonMode="StrongWildcard" 
         listenBacklog="10"
         maxBufferPoolSize="524288" 
         maxBufferSize="65536" 
         maxConnections="30"
         maxReceivedMessageSize="65536">
      <security mode="None">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </netTcpBinding>
</bindings>

, где не все находится под моим контролем. Могу ли я быть уверен, что совместное использование привязок (и других разделов ..) между службой и клиентом, что бы ни было написано, проходит хорошо как в службе, так и в клиенте?

Ответы [ 3 ]

4 голосов
/ 15 декабря 2009

Да, вы можете - в определенной степени:

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

т.е. поместите ваши привязки в bindings.config:

<?xml version="1.0" encoding="utf-8"?>
<bindings>
  <basicHttpBinding>
    <binding name="Default" useDefaultWebProxy="false">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Basic" 
                   proxyCredentialType="None" realm="" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

, а затем сослаться на этот файл из app.config или web.config вашего сервиса:

<system.serviceModel>
    <bindings configSource="bindings.config" />
</system.serviceModel>

Visual Studio будет жаловаться на "configSource" - но, поверьте мне, он работает. Это недостаток XML-схемы Visual Studio, используемой для проверки, но эта функция работает. На самом деле это работает для любого раздела конфигурации (но не для групп разделов конфигурации) в вашем web.config / app.config.

Вы можете сделать это для любого из «подразделов» группы конфигурации <system.serviceModel> - клиент, сервер, поведение, расширения, назовите его.

Марк

0 голосов
/ 10 сентября 2010

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

Затем вы можете использовать сборку как на клиенте, так и на сервере; это может хорошо работать, если вы уже используете совместно используемую сборку (а не сгенерированные прокси-классы) для определения интерфейсов WCF.

0 голосов
/ 15 декабря 2009

Да. Вот файл app.config (упрощенный), который я использую.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <client>
            <endpoint name="MyServiceClient"
                address="net.pipe://localhost/MyService"
                contract="IMyService"
                binding="netNamedPipeBinding" />
        </client>
        <services>
            <service name="MyService">
                <endpoint name="MyService"
                    address="net.pipe://localhost/MyService"
                    contract="IMyService"
                    binding="netNamedPipeBinding" />
            </service>
        </services>
    </system.serviceModel>
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...