Можно добавить одну ссылку на услугу для нескольких контрактов на обслуживание WCF - PullRequest
1 голос
/ 02 ноября 2009

У меня несколько сервисных контрактов, определенных в одной библиотеке WCF, которые размещены в службе Windows. Эти сервисы предоставляются в файле конфигурации службы Windows следующим образом:

<services>
  <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
    name="ReportingComponentLibrary.TemplateService">
    <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateService" bindingConfiguration="wsHttp" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateService/" />
      </baseAddresses>
    </host>
  </service>
  <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
    name="ReportingComponentLibrary.TemplateReportService">
    <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateReportService" bindingConfiguration="wsHttp" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateReportService/" />
      </baseAddresses>
    </host>
  </service>
</services>

Теперь, когда я добавляю ссылку на сервис в моем клиентском приложении,

Можно ли добавить только одну ссылку на услугу для двух вышеуказанных услуг или

Мне нужно отдельную ссылку для каждого контракта на обслуживание / услуги.

Обновление:

Вот мои данные приложения:

У меня есть три разных проекта:

  1. Сервисная библиотека WCF
  2. Служба Windows для размещения выше службы WCF
  3. Клиент - Консольное приложение для тестирования

Теперь App.Config в сервисной библиотеке WCF выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>     

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttp" maxReceivedMessageSize="50000000" maxBufferPoolSize="50000000" messageEncoding="Mtom">
          <readerQuotas maxDepth="500" maxStringContentLength="500000000" maxArrayLength="500000000"
          maxBytesPerRead="500000000" maxNameTableCharCount="500000000" />
        </binding>
      </wsHttpBinding>
    </bindings>

    <services>
      <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
        name="ReportingComponentLibrary.TemplateService">
        <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateService" bindingConfiguration="wsHttp" >
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateService/" />
          </baseAddresses>
        </host>
      </service>

      <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
        name="ReportingComponentLibrary.TemplateReportService">
        <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateReportService" bindingConfiguration="wsHttp" >
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateReportService/" />
          </baseAddresses>
        </host>
      </service>

    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="ReportingComponentLibrary.TemplateServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

И App.Config в Windows Service такой же, как указано выше.

Теперь в моем клиентском приложении мне нужно использовать методы как TemplateService, так и TemplateReportService.

Итак, я всегда могу указать две разные ссылки на сервис:

http://localhost:8080/ReportingComponentLibrary/TemplateService/ и

http://localhost:8080/ReportingComponentLibrary/TemplateReportService/

Это все работает нормально.

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

Ответы [ 2 ]

5 голосов
/ 02 ноября 2009

В нынешнем виде, я не думаю, что это возможно, вам понадобятся 2 ссылки на сервис, поскольку они оба реализуют отдельные контракты. Предполагая, что у вас есть контроль над сервисным кодом, вы можете реализовать обходной путь, при котором вы создаете сервисную оболочку для реализации обоих контрактов, указывая на два отдельных сервиса. Это позволит вам иметь одну справочную службу. Есть ли конкретная проблема, почему вы хотите, чтобы они оба работали в одном сервисе, а не в двух?

EDIT: Эта статья блога - Meineck.Net показывает вам, как вы можете настроить свои службы для достижения того, что вам нужно, но опять же, это в значительной степени обходной путь. Удачи.

2 голосов
/ 03 ноября 2009

Один сервисный номер = один сервисный контракт

Ваша служба Windows имеет много служб, каждая из которых имеет собственный контракт.

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

...