Почему я могу получить доступ к файлу WSDL из браузера, а не из приложения? - PullRequest
2 голосов
/ 30 июля 2010

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

Компьютер, на котором я работаю, называется Web01, а компьютер, который я использую для тестирования, называется Ts01. На обеих машинах я изменил файл hosts для перенаправления mydomain.com на соответствующий IP-адрес веб-сайта на Web01.

Я тестирую два способа доступа к веб-сервису на каждой машине:

  • Простой браузерный вызов http://www.mydomain.com/services/myservice.asmx?WSDL.
  • Тестовое приложение VB6, которое вызывает веб-сервис с использованием WSDL, указанного выше, через SOAPClient.

Вот результаты теста:

                   Browser              VB6 App
    Ts01             OK                   OK
    Web01            OK                  ERROR

Тест, похоже, работает нормально для всех ситуаций, кроме приложения VB6, установленного на веб-сервере. Ошибка, которую я получаю обратно:

-2147024809 - WSDLReader: сбой загрузки файла WSDL HRESULT = 0x80070057 - WSDLReader: сбой синтаксического анализатора XML для белья 0, позиция 0, причина: система не может найти указанный объект.

HRESULT = 0x1

Я получаю ту же ошибку на Ts01, если я предоставляю неверный WSDL-адрес в приложении VB6. Кажется, что приложение VB6 на Web01 не может получить доступ к dll веб-службы на Web01, что является большой проблемой.

Возможно, стоит отметить, что он работает и на моей локальной машине разработчика, где у меня установлено приложение VB6 и веб-служба на одной машине.

Почему у приложения VB6 могут возникнуть проблемы с обменом данными с веб-службой через SOAPClient при запуске из того же окна, в котором существует веб-служба?


Я использовал fiddler для проверки заголовков запросов на моей локальной машине, вызывающей наш сервер разработки. Вот разница между запросами браузера и SOAP-клиента:

Браузер:

GET http://devserver/services/myservice.asmx?WSDL HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-shockwave-flash, */*
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: devserver
Cookie: SIFR-PREFETCHED=true

SOAPClient (из приложения VB6):

GET http://devserver/services/myservice.asmx?WSDL HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)
Host: hbhswebnet
Connection: Keep-Alive
Pragma: no-cache

Я не уверен, что эта информация полезна, но, возможно, это так.

Ответы [ 5 ]

3 голосов
/ 30 июля 2010

Вот общая схема:

Q: « x » работает в браузере, но не работает в программе, которая выполняет ту же функцию, что и браузер. Что не так?

A: программа не делает то же самое, что и браузер.

Браузеры явно устанавливают заголовки, которые ваша программа не устанавливает (особенно если вы используете очень устаревший SOAPClient). Различные элементы сетевого оборудования и программного обеспечения могут смотреть на эти заголовки при принятии решения о том, как реагировать на ваши запросы.

Вы должны посмотреть на сетевой трафик в обоих случаях (браузер и программа), используя Fiddler или что-то еще, а затем внимательно изучить различия между поведением браузера и поведением вашей программы. Затем вы можете либо изменить программу, чтобы она была похожа на браузер, либо попросить сотрудников сети снизить уровень безопасности, чтобы ваша программа могла получить доступ к службе.

0 голосов
/ 19 июля 2017

Была такая же проблема. Код будет работать на моей машине, но не на клиентах. Пришлось загрузить IE-Tools-Internet Options и нажать Advanced. Прокрутите вниз до пункта «Безопасность» и снимите флажок «Не сохранять зашифрованные страницы на диск».

0 голосов
/ 01 мая 2014

Вероятно, что для файлов WSDL и / или самой службы требуется проверка подлинности. В моем случае (при условии базовой аутентификации) мне пришлось предоставить учетные данные для URL-адреса соединения SOAP, поэтому:

http://www.mydomain.com/services/myservice.asmx?WSDL

становится:

http://user:password@www.mydomain.com/services/myservice.asmx?WSDL

Конечно, это совершенно небезопасно в общедоступном Интернете, поэтому вы должны использовать HTTPS. Вы также должны ограничивать соединения только с доверенными узлами, если это возможно.

Это может работать или не работать с некоторыми обновлениями безопасности для вашего браузера или с MSXML:

https://support.microsoft.com/default.aspx?scid=kb;en-us;832414

В этом случае вам может потребоваться предоставить учетные данные, используя другие методы. Если вы можете получить доступ к файлу WSDL без учетных данных, вы все равно можете защитить службу с помощью учетных данных и передать их в конверт SOAP:

  sc.ssoapinit(WSDLURL)
  sc.ConnectorProperty("AuthUser") = "user"
  sc.ConnectorProperty("AuthPassword") = "password"  
0 голосов
/ 29 мая 2012

"Ошибка WSDLReader '80020009' WSDLReader: не удалось выполнить синтаксический анализатор XML с номером белья 0, положением строки 0, причина в следующем: не удалось разрешить имя или адрес сервера HRESULT = 0x1: неверная функция. - WSDLReader: сбой загрузки файла WSDL HRESULT= 0x80070057: Неверный параметр. - Клиент: один из предоставленных параметров недействителен. HRESULT = 0x80070057: Неверный параметр. "

Поврежденный реестр и веб-приложение Центра обновления Windows не будут инициировать какие-либо объекты, связанные с вашей сетью.сервис, и вы получите эту ошибку.Попробуйте перерегистрировать своих клиентов SOAP и SOAP Dlls или попробуйте переустановить их.

0 голосов
/ 31 июля 2010

Еще одна вещь, на которую стоит обратить внимание, это настройки прокси в браузере, вы проходите через прокси? VB6 получает некоторые, но не все параметры прокси-сервера из Internet Explorer, но не все другие браузеры.

Если Fiddler не работает, вам, возможно, придется закатать рукава и покопаться в Wireshark , чтобы узнать, почему VB6 не связывается.

Еще одна важная вещь: какой клиент SOAP вы используете? (Microsoft устарел и содержит ошибки, PocketSOAP, что-то домашнее?) Одно из предложений может заключаться в том, чтобы написать мыльный прокси для .Net, а затем использовать взаимодействие для работы с вашим мылом.

...