wsdl.exe с SSL/TLS
Я пытался дать больше информации провайдеру об ошибке, которую я получаю при попытке использовать один из его WS.
Они попросили меня использовать wsdl.exe для выполнения следующей команды:
wsdl.exe /l:CS / протокол:SOAP /verbose /sharetypes https:example.com/?wsdl
Я сделал это и получил: Ошибка: Произошла ошибка при обработке ' https://example.oom/?wsdl'. - Произошла ошибка при загрузке https://example.com/?wsdl. - Запрос был прерван: не удалось создать безопасный канал SSL/TLS.
Дело в том, что у меня есть сертификат для навигации по этому https://example.com/?wsdl, и я думаю, что он правильно установлен. Когда я пытаюсь перейти по этому URL в IE, мне нужно только выбрать сертификат из списка и дать ему определенное разрешение. Затем отображается WSDL. Я попросил своего провайдера WS сказать мне, как я могу сказать команде: "использовать ssl. Используйте этот сертификат". Они сказали мне спросить мою сетевую команду, но у меня нет такой вещи, поэтому я спросил Google, и я обнаружил: 1) включить SSL/TLS (если это означает, перейдите в: IE > Свойства обозревателя> Дополнительно> SSL/TLS включен, я это сделал) и 2) проверить сертификат установлен и доступен. Что я думаю, что это так.
Может кто-нибудь сказать мне, что я могу сделать? Как получается, что сертификат установлен, но команда не может достичь его?
2 ответа
Вы говорите, что вам нужно предоставить клиентский сертификат для перехода на эту веб-страницу? Если это так, я не уверен, что вы можете использовать wsdl.exe
инструмент непосредственно для подключения к нему.
Но вам не нужно. Загрузите WSDL в IE и сохраните его как XML, затем укажите wsdl.exe
в локальную копию файла. Единственной разницей в выходных данных будет адрес конечной точки по умолчанию, встроенный в прокси-класс. В любом случае вы должны установить это значение во время выполнения, но вы всегда можете просто отредактировать автоматически сгенерированный код C# и исправить его. Фактические контракты на обслуживание и данные и код реализации будут точно такими же.
Одно предостережение: если этот WSDL создан WCF, вам нужно проделать дополнительную работу. WCF создает федеративное определение WSDL: часто полдюжины или более отдельных XSD-файлов составляют полное определение WSDL. Обычно информация о соединении находится в одном файле, а информация о типе извлекается откуда-то еще с помощью тегов, которые выглядят следующим образом:
<wsdl:types>
<xsd:schema targetNamespace="foo">
<xsd:import schemaLocation="https://localhost/Foo.svc?xsd=xsd0" namespace="foo"/>
<xsd:import schemaLocation="https://localhost/Foo.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="https://localhost/Foo.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/Foo.Model"/>
<xsd:import schemaLocation="https://localhost/Foo.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/System.Collections.ObjectModel"/>
</xsd:schema>
</wsdl:types>
Если это правда, вам нужно будет сделать две вещи, чтобы получить WSDL, который вам нужен:
- Загрузите все файлы, на которые есть ссылки; это будет либо
<?include>
директивы или<wsdl:import>
теги, найденные в другом файле XML, которые извлекают второй. Вам нужно проверять каждый новый файл, так как часто есть импорт второго и третьего уровня. Положите все в одну папку. - Отредактируйте все эти ссылки, чтобы удалить URL-адреса, и просто используйте локальные ссылки на файлы.
Как только это будет сделано, wsdl.exe
должен работать нормально. (В.NET 4.5 имеется встроенная поддержка динамического выравнивания файла WSDL, но до этого вам придется делать это вручную.)
Загрузите wsdl в браузер, сохраните его в файл и затем используйте wsdl.exe в локальном файле.