#wcf #soap #https #endpoint #bad-request
#wcf #soap #https #конечная точка #неверный запрос
Вопрос:
У меня есть служба WCF, размещенная в IIS, за балансировщиком нагрузки. SSL выгружается в LB, а затем служба вызывается по обычному HTTP.
Я получил рабочую конечную точку REST сервиса, но, похоже, я не могу заставить конечную точку SOAP отображать страницу wsdl. При вызове https://domain/Service.svc/soap?wsdl
браузер получает ответ на запрос в 400 строк. Я также проверил svclog, и там ошибка, There is a problem with the XML that was received from the network. See inner exception for more details.
что означает, что он ожидал, что я сделаю POST
вместо GET
и отправлю XML-файл.
Фрагменты из конфигураций:
<bindings>
<basicHttpBinding>
<binding name="basicBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="Transport"></security>
<readerQuotas maxStringContentLength="2147483647" />
</binding>
</basicHttpBinding>
<webHttpBinding>
<binding name="webBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="Transport"></security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="MyServiceBehavior" name="Namespace.Service">
<endpoint address="" behaviorConfiguration="MyRESTBehavior" binding="webHttpBinding" bindingConfiguration="webBinding" name="REST" contract="Namespace.IService" />
<endpoint address="https://domain/Service.svc/soap" binding="basicHttpBinding" bindingConfiguration="basicBinding" name="SOAP" contract="Namespace.IService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="6553600" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="MyRESTBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
Я тоже пытался использовать wsHttpBinding, но единственным другим результатом было получение 401
s вместо этого. Приветствуются любые указания.
Ответ №1:
Я не верю, что вы можете использовать абсолютный адрес для базовой конечной точки привязки HttpBinding. Попробуйте это вместо:
<endpoint address="soap" binding="basicHttpBinding" bindingConfiguration=...
Для доступа к WSDL ваш URL должен выглядеть примерно так: «https://domain/soap/Service.svc?wsdl «. С помощью IIS и WCF вы не можете переопределить URL виртуального каталога. Значение адреса конечной точки должно быть относительно URL веб-сайта.
Ответ №2:
Я нашел это. Ранее я удалил httpsGetUrl
атрибут из serviceMetadata
, потому что дважды получал сообщение об ошибке публикации сервиса. Теперь я думаю, что ошибка, вероятно, была вызвана опечаткой, и мне не следовало удалять httpsGetUrl
. Изменение behaviors
раздела на приведенный ниже решило мою проблему:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" httpsGetUrl="https://domain/Service.svc/soap" />
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="6553600" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="MyRESTBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>