Базовый адрес WCF не найден - PullRequest
1 голос
/ 14 июля 2010

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

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

Требования:

  • Работает на существующем веб-сайте
  • Использование сессий
  • Работает с Java и с максимально возможным количеством версий .net.
  • Выставить метаданные (будет достаточно wsdl)

редактирует:

  • IIS не может использоваться
  • Я использую .NET 4 и WCF 4.

В этой конфигурации метаданные могут быть доступны (через файл wsdl), но при попытке разместить обычные конечные точки wcf, которые я получаю, и InvalidOperationException:

Не удалось найти базовый адрес, который соответствует схеме http для конечной точки с привязкой WSHttpBinding. Зарегистрированные схемы базовых адресов: [].

Таким образом, базовый адрес игнорируется.

Но когда я предоставляю полные адреса конечным точкам (просто копируем базовый адрес перед текущим адресом), нормальные вызовы WCF работают нормально, но при попытке доступа к метаданным я получаю следующую ошибку: Нет привязки протокола к указанному адресу 'http://localhost:8080/Functionality'.

Привязки протокола настраиваются на уровне узла в конфигурации IIS или WAS.

Вот раздел web.config serviceModel, я сделал небольшой тестовый веб-сайт только для тестирования этого, но было бы слишком много, чтобы опубликовать все это здесь, если вы отправите мне личку, хотя я отправлю по электронной почте тебе.

 <system.serviceModel>
  <services>
   <service behaviorConfiguration="metadataSupport" name="MyStuff.TestWithMetadata">
    <endpoint address="Functionality" binding="wsHttpBinding" name="FunctionalityBinding"
     contract="MyStuff.ITestWithMetadata" />
    <host>
     <baseAddresses>
      <add baseAddress="http://localhost:8080/" />
     </baseAddresses>
    </host>
   </service>
  </services>
  <behaviors>
   <endpointBehaviors>
    <behavior name="metadataSupport">
     <webHttp />
    </behavior>
   </endpointBehaviors>
   <serviceBehaviors>
    <behavior name="metadataSupport">
     <!--Navigate with browser to httpGetUrl for the wsdl file-->
     <serviceMetadata httpGetEnabled="true" httpGetUrl="Metadata" />
     <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="false">
   <serviceActivations>
    <add relativeAddress="TestWithMetadata.svc" service="MyStuff.TestWithMetadata" />
   </serviceActivations>
  </serviceHostingEnvironment>
 </system.serviceModel>

Если у кого-нибудь есть идеи, как решить эту проблему, пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 15 июля 2010

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

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

Я принял ответ Марка, потому что он помог мне с этим и не дал этому вопросу всплыть без ответа.

1 голос
/ 14 июля 2010

Когда вы размещаете свой сервис в IIS (который я предполагаю из вашего требования «Запускается на существующем веб-сайте»), тогда ваш базовый адрес в конфиге является спорным - он вообще не будет использоваться.

При размещении в IIS адрес вашей службы определяется следующим образом:

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

Так что это может быть что-то вроде:

http://MyServer:7777/ExistingWebApp/TestWithMetadata.svc

или что-то ещеэто то, что у вас есть.

Похоже, вы используете .NET 4 и WCF 4 (никогда не упоминал об этом .....), и в этом случае вы можете вообще пропустить файл * .svcадаптируя запись конфигурации:

<serviceHostingEnvironment multipleSiteBindingsEnabled="false">
    <serviceActivations>
        <add relativeAddress="MyService" service="MyStuff.TestWithMetadata" />
    </serviceActivations>
</serviceHostingEnvironment>

В этом случае значение relativeAddress= становится адресом службы (в виртуальном каталоге, в котором находится web.config), поэтому ваш адрес службы будет выглядеть примерно так::

http://MyServer:7777/ExistingWebApp/MyService

Нет необходимости в * .svc файле на всехЯ в этой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...