Я пытался опубликовать веб-службу 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
на папку, содержащую сервис.Любые идеи, почему это происходит и что я могу сделать, чтобы решить эту проблему?
Если вы используете режим безопасности транспорта, почему бы не использовать https-адреса? Базовый адрес https/http должен быть настроен в модуле привязки сайта IIS.
Кроме того, поскольку вы используете обычную аутентификацию, включите анонимную и обычную аутентификацию в модуле аутентификации IIS.
Со своей стороны, я могу правильно добавлять ссылки на сервисы с помощью консольного приложения на базе ядра.
Кроме того, включите следующую функцию Windows для WCF.
Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.
Включение функций Windows, упомянутых в этом посте, помогло. Я уже использовал https, просто случайно написал http. Переключение между https/http было одной из многих вещей, которые я пробовал. Большое спасибо за помощь!