Как настроить несколько конечных точек служб в WCF?

2

Я хотел бы получить некоторые основные рекомендации по настройке моей конфигурации WCF. Это мои первые серьезные усилия с WCF (и первый пост на StackOverflow).

У меня есть библиотека классов WCF (APILibrary), на которую я ссылаюсь в мой веб-проект. В wcf-библиотеке у меня в настоящее время есть два услуги - IAuthService и ITradeService.

Вдоль этих строк у меня есть три вопроса:

1) Моя проблема (и исходная причина этого сообщения), что когда я компилировать мое приложение, я могу вызвать TradeServiceCient, но не AuthServiceClient в моем веб-приложении. Последнее не появляется в intellisense. У меня такое чувство, что оно связано с тем, что они делятся тот же порт (и включен только один конечный пункт), но я, очевидно, неясна.

2) Я пытаюсь разоблачить две конечные точки обслуживания одновременно (и, вероятно, еще несколько), пока я разрабатываю и тестирую. Когда я перехожу к постановке и хостинг, у каждой конечной точки будет свой собственный адрес. До тех пор, как сделать Я делаю это (у меня такое чувство относится к моему вопросу выше)?

3) Я замечаю во многих сообщениях, что у людей есть примеры "клиента", и "server" "system.serviceModel". Являются ли эти уникальные файлы или теги в файле App.config, который находится в моей библиотеке WCF? Что каждый делает? В настоящее время, я думаю, у меня просто есть серверная сторона?

Вот что я имею в моем файле App.config(в моей библиотеке WCF):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <client />
    <services>
      <service behaviorConfiguration="ApiLibrary.ApiBehavior" name="SpoonSys.Api.Trade.TradeService">
        <endpoint address="" binding="wsHttpBinding" contract="SpoonSys.Api.Trade.ITradeService">
          <identity>
            <dns value="localhost:8731" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/Trade/" />
          </baseAddresses>
        </host>
      </service>

      <service behaviorConfiguration="ApiLibrary.ApiBehavior" name="SpoonSys.Api.Authentication.AuthService">
        <endpoint address="" binding="wsHttpBinding" contract="SpoonSys.Api.Authentication.IAuthService">
          <identity>
            <dns value="localhost:8731" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/Authentication/" />
          </baseAddresses>
        </host>
      </service>  
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ApiLibrary.ApiBehavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Моя конфигурация - это ASP.NET/Framework 3.5/VS 2008/С#

  • 0
    @marc_s говорит: «Другой вопрос - почему вы видите только одну конечную точку в вашем intellisense - вы создали клиентский прокси для обеих конечных точек? Поскольку это два отдельных контракта, вам понадобятся два отдельных клиентских прокси. Как вы создавали свой прокси-сервер? конечная точка клиента? Можете ли вы также опубликовать конфигурацию клиента? "
Теги:
web-services
wcf
endpoints

2 ответа

4

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

Единственное, что я изменил в вашей конфигурации, это разделить между "baseAddress" и фактическим адресом службы. В настоящее время вы определяете полный полный адрес в своем базовом адресе - это своего рода поражает цель базового адреса. Я бы разделил его так:

 <service name="SpoonSys.Api.Services"
          behaviorConfiguration="ApiLibrary.ApiBehavior" >
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/" />
      </baseAddresses>
    </host>
    <endpoint 
       address="Trade" 
       binding="wsHttpBinding" 
       contract="SpoonSys.Api.Trade.ITradeService">
      <identity>
        <dns value="localhost:8731" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>

Таким образом, вы можете в основном свернуть ваши две конечные точки в один - базовый адрес определяет именно это - общую базу для всех других адресов - в то время как конечная точка определяет детали полного адреса:

 <service name="SpoonSys.Api.Services"
          behaviorConfiguration="ApiLibrary.ApiBehavior" >
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/" />
      </baseAddresses>
    </host>
    <endpoint 
       address="Trade" 
       binding="wsHttpBinding" 
       contract="SpoonSys.Api.Trade.ITradeService">
      <identity>
        <dns value="localhost:8731" />
      </identity>
    </endpoint>
    <endpoint 
       address="Authentication" 
       binding="wsHttpBinding" 
       contract="SpoonSys.Api.Authentication.IAuthService">
      <identity>
        <dns value="localhost:8731" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>

Это работает, если у вас есть один класс обслуживания "SpoonSys.Api.Services", который реализует оба этих контракта на обслуживание, - это совершенно нормально и довольно полезно время от времени.

ЕСЛИ у вас должно быть два отдельных класса обслуживания, каждый из которых реализует один интерфейс, тогда вы не сможете свернуть свой конфигурационный файл, как это, - тогда вам придется использовать полную конфигурацию для двух отдельных классов обслуживания в вашем оригинале (что мне показалось мне хорошо).

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

Марк

0

Я попробовал сократить базовый адрес по вашему предложению. Тогда я получил ошибку, одна служба начнется, но не другая. Мне сказали, что конечная точка метаданных уже используется. Затем я попытался изменить свои пространства имен из SpoonSys.ApiLibrary.Authentication и SpoonSys.ApiLibrary.Trade просто SpoonSys.ApiLibary для всех файлов классов. Тем не менее - та же ошибка. Когда я вернулась к исходной конфигурации сервера, она скомпилирована. Тем не менее, intellisense только поднимает одну услугу, а не другую.

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

Я заметил файл Client.dll в редакторе WCF для каждой конечной точки и разместил ниже:

ENDPOINT: локальный: 8731/Design_Time_Addresses/аутентификации/MEX

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_ITradeService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="localhost:8731/Design_Time_Addresses/Trade/"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITradeService"
                contract="ITradeService" name="WSHttpBinding_ITradeService">
                <identity>
                    <dns value="localhost:8731" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

ENDPOINT: http://localhost:8731/Design_Time_Addresses/Trade/mex

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IAuthService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="localhost:8731/Design_Time_Addresses/Authentication/"
                binding="wsHttp binding" bindingConfiguration="WSHttpBinding_IAuthService"
                contract="IAuthService" name="WSHttpBinding_IAuthService">
                <identity>
                    <dns value="localhost:8731" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

И наконец, вот мой APP.CONFIG AGAIN:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="ApiLibrary.ApiBehavior"
        name="SpoonSys.ApiLibrary.Trade.TradeService">
        <endpoint address="" binding="wsHttpBinding" contract="SpoonSys.Api.Trade.ITradeService">
          <identity>
            <dns value="localhost:8731" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/Design_Time_Addresses/Trade/" />
          </baseAddresses>
        </host>
      </service>
      <service behaviorConfiguration="ApiLibrary.ApiBehavior"
        name="SpoonSys.Api.Authentication.AuthService">
        <endpoint address="" binding="wsHttpBinding" contract="SpoonSys.ApiLibrary.Authentication.IAuthService">
          <identity>
            <dns value="localhost:8731" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="localhost:8731/Design_Time_Addresses/Authentication/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ApiLibrary.ApiBehavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

PS - Я получаю, что "новые пользователи могут публиковать максимум одну гиперссылку", когда я пытаюсь отправить свой ответ, поэтому я вынул все ссылки "http://" в своем сообщении. Это не ошибка кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню