Конечные точки WCF и проблемы конфигурации привязки - PullRequest
1 голос
/ 01 марта 2011

Я сталкиваюсь с очень странной проблемой здесь, ребята. Для простоты я создал проект с единственной целью тестирования проблемы вне рамок более крупного приложения и все еще сталкивался с тем, что является либо ошибкой в ​​WCF в Visual Studio 2010, либо чем-то связанным с моим набором навыков для новичка WCF:)

Вот вопрос:

У меня есть конечная точка WCF, которую я создал внутри проекта MVC3 под названием «SimpleMethod». Метод запускается внутри файла .svc в корне приложения и возвращает bool.

Используя «Редактор конфигурации службы WCF», я добавил конечную точку в свой Web.Config вместе с так называемым «LargeImageBinding».

Вот услуга:

    [OperationContract]
    public bool SimpleMethod()
    {
        return true;
    }

И Web.Config, сгенерированный инструментом Config:

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="LargeImageBinding" closeTimeout="00:10:00" />
  </wsHttpBinding>
</bindings>
<services>
  <service name="WCFEndpoints.ServiceTestOne">
    <endpoint address="/ServiceTestOne.svc" binding="wsHttpBinding"
      bindingConfiguration="LargeImageBinding" contract="WCFEndpoints.IServiceTestOne" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

Служба работает нормально, и вы можете увидеть конечную точку при переходе к: http://localhost:57364/ServiceTestOne.svc - Теперь проблема возникает, когда я создаю отдельный проект для использования службы. Я добавляю сервисную ссылку к работающему экземпляру вышеуказанного проекта, указываю на: http://localhost:57364/ServiceTestOne.svc

Вот странная часть. Служба автоматически генерирует просто отлично, но в Web.Config генерируемая конечная точка выглядит следующим образом:

<client>
  <endpoint address="http://localhost:57364/ServiceTestOne.svc/ServiceTestOne.svc"
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceTestOne"
    contract="ServiceTestOne.IServiceTestOne" name="WSHttpBinding_IServiceTestOne">

Как вы видите, в нем дважды указывается часть адреса "ServiceTestOne.svc"!

Когда я звоню в сервис, я получаю следующую ошибку:

Удаленный сервер возвратил ошибку: (404) Not Found.

Я попытался удалить лишний "/ServiceTestOne.svc" в конце адреса конечной точки в вышеуказанном конфиге, и я получаю точно такую ​​же ошибку.

Теперь работает, если я возвращаюсь в приложение WCF и удаляю пользовательскую конечную точку и ссылки привязки в Web.Config (все в тегах «services» и «bindings»), затем возвращаюсь к приложению-потребителю, обновите ссылку на сервис и сделайте вызов SimpleMethod () .... BOOM работает как чудо, и я возвращаю bool, установленный в true.

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

Может ли кто-нибудь увидеть какой-либо недостаток в том, как я это собираю? Спасибо за то, что уделили мне время - я бегал по кругу с этим около недели!

1 Ответ

2 голосов
/ 01 марта 2011

При размещении службы WCF в IIS базовый адрес службы формируется в следующем формате: {protocol}: // {host}: {port} / {applicationName} / {svcFileName}. Это адрес, по которому вы можете перейти, чтобы получить страницу справки WCF и / или метаданные (в конфигурации по умолчанию).

Чтобы сформировать фактический адрес конечной точки (тот, который должен использовать ваш клиент), используется следующий формат: {serviceBaseAddress} / {endpointAddress}

Сравнение вышеприведенного формата и примера конфигурации, которое вы предоставили, объясняет, почему вы получаете ServiceTestOne.svc дважды на свой адрес клиента.

Если вы хотите, чтобы адрес вашей службы был http://localhost:57364/ServiceTestOne.svc,, я бы рекомендовал оставить атрибут адреса пустым в вашей конфигурации конечной точки:

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