Можно добавить одну ссылку на службу для нескольких сервисных контрактов WCF

StackOverflow https://stackoverflow.com/questions/1661284

  •  12-09-2019
  •  | 
  •  

Вопрос

У меня есть несколько сервисных контрактов, определенных в одной библиотеке 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 такой же, как указано выше.

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

Таким образом, я всегда могу использовать две разные Ссылки на Сервис в качестве:

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

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

Все это работает нормально.

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

Это было полезно?

Решение

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

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

Другие советы

Одна Ссылка на обслуживание = Один Сервисный контракт

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top