Как исправить: «Метаданные содержат ссылку, которая не может быть разрешена: 'http://<host>:<port><path>? Wsdl'." для "Настроить ссылку на веб-службу WCF" в vs - PullRequest
1 голос
/ 28 мая 2019

Я пытался опубликовать веб-службу WCF на своем сервере IIS, используя нестандартный порт HTTPS. Доступ к серверу должен быть возможен только после аутентификации (через обычную аутентификацию). Веб-сервис, созданный для тестирования, является базовым проектом, который вы получаете по умолчанию при создании WCF Service Application в Visual Studio. Единственные изменения, которые я сделал, находятся в файле web.config:

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

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <bindings>
      <basicHttpBinding>
        <binding name="secureHttpBinding">
          <security mode="Transport">
            <transport clientCredentialType="Basic"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="SoapApi.Service1">
        <endpoint address=""
                  binding="basicHttpBinding"
                  bindingConfiguration="secureHttpBinding"
                  contract="SoapApi.IService1"/>

        <endpoint address="mex"
                  binding="mexHttpsBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

После публикации службы в локальной файловой системе и настройки IIS. Мне удалось получить доступ к файлу WSDL на сервере после аутентификации из браузера на моем локальном ПК. Но если я пытаюсь добавить службу в простое клиентское приложение с помощью мастера Configure WCF Web Service Reference из Visual Studio, я получаю следующее сообщение об ошибке:

Metadata contains a reference that cannot be resolved:'http://<host>:<port><path>?wsdl'.

и полное сообщение об ошибке:

An error occurred while attempting to find services at 'http://<host>:<port><path>?wsdl'. The remote server returned an error: (403) Forbidden.

Так как эта ошибка указывает на то, что у меня нет разрешения на доступ, я подумал, почему бы не отключить аутентификацию и попробовать, если она работает. Я активировал анонимный доступ к сайту в IIS и отключил базовую аутентификацию. Кроме того, я изменил следующий отрывок в файле web.config:

<basicHttpBinding>
    <binding name="secureHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
 </basicHttpBinding>

Я все еще могу получить доступ к файлу WSDL из своего браузера, но, тем не менее, я все еще получаю ту же ошибку при добавлении ссылки на службу к клиенту. То же самое происходит, если я проверяю это через dotnet-svcutil http://<host>:<port><path>?wsdl

Если я пытаюсь добавить сервисную ссылку локально, все работает без проблем.

Дополнительная информация:

  • Я уже установил .NET Framework 4.6, и это WCF HTTP Activation обработчик.
  • Я добавил разрешение IIS_IUSRS в папку, содержащую сервис.

Есть идеи, почему это происходит и что я могу сделать, чтобы решить эту проблему?

1 Ответ

1 голос
/ 29 мая 2019

Если вы используете режим безопасности транспорта, почему бы не использовать адреса https? Базовый адрес https / http должен быть настроен в модуле привязки сайта IIS. enter image description here
Кроме того, поскольку вы используете базовую аутентификацию, включите анонимную аутентификацию и базовую аутентификацию в модуле аутентификации IIS.
Со своей стороны, я могу правильно добавить ссылки на службы с помощью консольного приложения на базе Core.
Кроме того, пожалуйста, включите следующую функцию окон для WCF. enter image description here
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

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