Меню

Ошибка soap faultcode http faultstring internal server error

Проблемы

Если вы посещаете на корпоративном портале такие страницы, связанные с проектом, такие как ввод времени, запись расходов, веб-часть Communicator, аналитик проекта и руководитель проекта, вы получаете сообщение об ошибке, которое напоминает один из указанных ниже вариантов.

Сообщение об ошибке 1:

Ошибка: вложение: превышено максимальное число повторных попыток соединения. HRESULT = 0x80004005: Неопределенная ошибка — клиент: произошла непредвиденная ошибка во время обработки этого запроса. HRESULT = 0x80004005: Неопределенная ошибка — клиент: Отправка сообщения SOAP завершилась сбоем или не удается распознать полученный ответ (HRESULT = 0x80004005) HRESULT = 0x80004005: Неуказанная ошибка FaultCode = клиент faultString = вложение: максимально допустимое число повторных попыток подключения истекло.

Дополнительные сведения можно найти в разрешениях 6, 7, 8 и 9.

Сообщение об ошибке 2:

Соединитель: истекло время ожидания подключения. HRESULT = 0x800A1527-Client: в ходе обработки запроса возникла непредвиденная ошибка. HRESULT = 0x800A1527-клиент: не удалось отправить сообщение SOAP или не удается распознать полученный ответ HRESULT = 0x800A1527-клиент: Неуказанная ошибка клиента.

Дополнительные сведения можно найти в разрешениях 6, 7, 8 и 9.

Сообщение об ошибке 3:

Соединитель: неверный сертификат. HRESULT = 0x800A1529-Client: в ходе обработки запроса возникла непредвиденная ошибка. HRESULT = 0x800A1529-клиент: не удалось отправить сообщение SOAP или не удается распознать полученный ответ HRESULT = 0x800A1529-клиент: Неуказанная ошибка клиента. HRESULT=0x800A1529

Ознакомьтесь с разрешениями 6 и 9

Сообщение об ошибке 4:

Соединитель: Неуказанная ошибка HTTP. HRESULT = 0x800A1518-Client: в ходе обработки запроса возникла непредвиденная ошибка. HRESULT = 0x800A1518-клиент: не удалось отправить сообщение SOAP или не удается распознать полученный ответ HRESULT = 0x800A1518-клиент: Неуказанная ошибка клиента. HRESULT=0x800A1518

Дополнительные сведения можно найти в разрешениях 6, 7, 8 и 9.

Сообщение об ошибке 5:

Сбой подключения.: в соединителе не включена совпадающая схема авторизации. HRESULT = 0x80004005: Неопределенная ошибка — клиент: произошла непредвиденная ошибка во время обработки этого запроса. HRESULT = 0x80004005: Неопределенная ошибка — клиент: Отправка сообщения SOAP завершилась сбоем или не удается распознать полученный ответ (HRESULT = 0x80004005) HRESULT = 0x80004005: Неопределенная ошибка

Дополнительные сведения о разрешениях 7 и 9

Сообщение об ошибке 6:

Клиент: не удалось загрузить запрос в SoapReader. HRESULT = 0x80070057: неверный параметр. -Клиент: ошибка «неопределенный клиент». HRESULT = 0x80070057: неверный параметр. FaultCode = Client.

Дополнительные сведения можно найти в разрешениях 6, 7, 8 и 9.

Сообщение об ошибке 7:

Приложению не удается открыть системную базу данных. [DBNETLIB] [ConnectionOpen (соединение ()).] SQL Server не существует или в доступе отказано.Чтобы устранить эту проблему, системный администратор должен запустить pcConfiguration на сервере бизнес-портала.

Дополнительные сведения о разрешениях 5 и 9

Сообщение об ошибке 8:

Произошла ошибка. Ошибка: произошла ошибка при попытке открыть системную базу данных. (pcconnect)

Дополнительные сведения о разрешениях 1, 2, 3, 4 и 9

Сообщение об ошибке 9:

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

Дополнительные сведения о разрешениях 1, 2, 3, 4 и 9

Сообщение об ошибке 10:

Не удается подключиться к системной базе данных. Запустите PCConfiguration. Недопустимые имя пользователя и пароль.

Дополнительные сведения о разрешениях 4 и 9

Сообщение об ошибке 11:

Ошибка: Клиент SOAP: при обработке запроса SOAP произошла ошибка. Недопустимый путь к PCService. asmx, указанному в ProjectService. wsdlYour. чтобы устранить эту проблему, запустите системный администратор pcConfiguration-Update на сервере бизнес-портала.

Ознакомьтесь с разрешениями 6 и 9

Причина

Для того чтобы страницы проекта были доступны, службы IIS должны иметь возможность подготовить и отправить запрос протокола SOAP в файл PCService. asmx.  Для работы необходимо настроить несколько вещей.  Если один или несколько из указанных ниже параметров заданы неправильно, это может привести к ошибкам, перечисленным в разделе «проблема».

  1. Данные для входа в базу данных Microsoft Dynamics SL отсутствуют или неправильно хранятся в реестре.

  2. Приложение Microsoft. Соломоновы. PMA. Security. ImpersonateDLL. dll отсутствует, не зарегистрировано или у пользователей нет разрешений на доступ к файлу.

  3. Учетная запись в пуле приложений не имеет разрешений на доступ к разделу реестра HKEY_LOCAL_MACHINE SOFTWAREMicrosoftBusiness PortalPMASolomon

  4. Файл CAPICOM. dll отсутствует, не зарегистрирован, имеет неверную версию или у пользователей нет разрешений на доступ к файлу.

  5. Сервер, на котором запущены службы IIS и SQL Server, должен поддерживать связь с помощью протокола TCP/IP.

  6. Путь к файлу PCService. ASX в файле ProjectService. WSDL указан неправильно

    1. Путь должен указывать на имя сервера IIS

    2. Путь должен содержать номер порта

    3. Путь должен быть URL-адресом, который не является SSL

    4. При использовании заголовков узлов IIS путь должен разрешаться на соответствующий веб-сайт.

  7. Сайт IIS не использует проверку подлинности Windows (NTLM)

  8. Переменная SessionState в файле Web. config задана неправильно

Обычно сообщение об ошибке не содержит подробной информации о том, какие из предыдущих элементов могут быть неправильными.  Поэтому мы рекомендуем попробовать все возможные решения.

Решение

Разрешение 1- Запуск служебной программы PCConfiguration

  1. Откройте файл PCConfiguration. exe на сервере бизнес-портала и дважды щелкните его, чтобы выполнить.  Обычно это расположение находится в папке c:Inetpubwwwrootbin или в папке C:InetpubwwwrootwssVirtualDirectories80bin.

  2. Заполните следующие поля:

    1. Имя сервера SQL Server: введите имя сервера SQL Server, на котором размещаются базы данных Microsoft Dynamics SL.

    2. Системная БД — введите имя базы данных системы Microsoft Dynamics SL.

    3. Пользователь SQL: введите имя пользователя SQL, у которого есть доступ к системной базе данных.  «SA» или «BusinessPortalUser» — распространенные параметры.

    4. Password (пароль): введите пароль пользователя, введенного в поле пользователя SQL

  3. Нажмите кнопку проверить соединение.  Если появляется сообщение об ошибке, проверьте значения на этапе 2. Примечание. Эта кнопка может не выполнить действие из-за ошибки 55474.

  4. Нажмите кнопку обновить реестр.  Появится следующее сообщение: «данные успешно записаны в реестр».

  5. Закройте служебную программу и попробуйте еще раз.

Разрешение 2 — проверка файла Microsoft. Соломоновы. PMA. Security. ImpersonateDLL. dll

  1. На сервере бизнес-портала запустите диспетчер информационных служб Интернета (IIS).

  2. Щелкните правой кнопкой мыши веб-сайт бизнес-портала и выберите пункт «Свойства»

  3. На вкладке домашний каталог запишите значение в поле «локальный путь».

  4. На вкладке «домашний каталог» Обратите внимание на значение в поле со списком «Группа приложений».

  5. Нажмите кнопку ОК, чтобы закрыть окно «Свойства».

  6. В диспетчере IIS разверните элемент «пулы приложений».  Щелкните правой кнопкой мыши группу приложений, найденную на шаге 4, и выберите пункт «Свойства».

  7. На вкладке «удостоверение» Обратите внимание на пользователя, указанного в качестве удостоверения пула приложений.

  8. Нажмите кнопку ОК, чтобы закрыть окно «Свойства».

  9. Закрытие диспетчера IIS

  10. В проводнике Windows перейдите к каталогу, найденному на шаге 3.

  11. Прокрутите папку bin вниз и найдите файл Microsoft. Соломоновы. PMA. Security. ImpersonateDLL. dll.

    1. Если этот файл отсутствует, может потребоваться переустановка бизнес-портала

  12. Щелкните файл правой кнопкой мыши и выберите пункт Свойства.

  13. На вкладке «безопасность» убедитесь в том, что у пользователя на шаге 7 есть права «чтение» и «чтение & выполнения»

  14. Нажмите кнопку ОК, чтобы закрыть окно «Свойства».

  15. Щелкните файл правой кнопкой мыши и выберите команду «Открыть с помощью…»

  16. Выберите «выбрать программу из списка»

  17. Нажмите кнопку «Обзор…»

  18. Перейдите в папку C:WindowsSystem32 и найдите файл regsvr32. exe и нажмите кнопку «Открыть».

  19. Нажмите кнопку ОК.  Появится следующее сообщение: «DllRegisterServer в C:InetpubwwwrootbinMicrosoft.Solomon.Pma.Security.ImpersonateDLL.dll успешно».

  20. Попробуйте еще раз загрузить страницы рабочего портала

Разрешение 3 : Проверка раздела реестра

  1. На сервере бизнес-портала запустите диспетчер информационных служб Интернета (IIS).

  2. Щелкните правой кнопкой мыши веб-сайт бизнес-портала и выберите пункт Свойства.

  3. На вкладке «домашний каталог» Обратите внимание на значение в поле со списком «пул приложений».

  4. Нажмите кнопку ОК, чтобы закрыть диалоговое окно «Свойства» и выйти из диспетчера IIS

  5. Выберите Пуск-> выполнить и введите RegEdt32.  В этом случае следует открыть редактор реестра.

  6. Перейдите на HKEY_LOCAL_MACHINE SOFTWAREMicrosoftBusiness PortalPMASolomon

    1. Если этот раздел реестра отсутствует, ознакомьтесь с разделом разрешение 1, чтобы запустить служебную программу PCConfiguration

  7. Щелкните правой кнопкой мыши «Соломоновы» и выберите «разрешения»

  8. Убедитесь в том, что пользователь из этапа 3 имеет разрешения «чтение»

  9. Попробуйте еще раз загрузить страницы рабочего портала

Более подробную информацию вы видите в статье базы знаний 912363 .

Разрешение 4 : Проверка файла CAPICOM. dll

  1. Перейдите в папку C:WindowsSystem32 на сервере бизнес-портала.

  2. Щелкните правой кнопкой мыши элемент CAPICOM. Файл DLL и выберите пункт «Свойства»

    1. Если этот файл отсутствует, возможно, потребуется скопировать файл с другой рабочей станции или переустановить бизнес-портал.

  3. На вкладке Версия убедитесь в том, что в версии файла отображается 2.1.0.1

    1. Если версия файла неверна, возможно, потребуется скопировать файл с другой рабочей станции или переустановить бизнес-портал

  4. На вкладке Безопасность Убедитесь, что в группе доменные службы есть разрешение чтение и чтение & выполнение прав на этот файл.  Ознакомьтесь состатьей базы знаний 927618

  5. Нажмите кнопку ОК, чтобы закрыть диалоговое окно «Свойства».

  6. Щелкните файл правой кнопкой мыши и выберите команду «Открыть с помощью…»

  7. Выберите «выбрать программу из списка»

  8. Нажмите кнопку «Обзор…»

  9. Перейдите в папку C:WindowsSystem32 и найдите файл regsvr32. exe и нажмите кнопку Открыть.

  10. Нажмите кнопку ОК.  Появится следующее сообщение: «DllRegisterServer в C:WINDOWSsystem32capicom.dll успешно».

  11. Попробуйте еще раз загрузить страницы рабочего портала

  12. Если вы по-прежнему получаете сообщение об ошибке:

    1. Чтобы снова запустить служебную программу PCConfiguration, ознакомьтесь с разрешениями 1.

    2. Перезапустите IIS, нажав Пуск-> выполнить и введите «IISReset».

    3. Попробуйте еще раз загрузить страницы рабочего портала

Более подробную информацию вы видите в статье базы знаний 909144 .

Разрешение 5 – Проверка возможности связи сервера IIS и сервера SQL Server с помощью протокола TCP/IP

  1. Протокол TCP/IP должен быть включен как на сервере SQL Server, так и на сервере IIS, на котором размещаются сайты бизнес-портала.

  2. Сведения о том, как это проверить, можно найти в статье база знаний 954024

Разрешение 6 : Проверьте путь к файлу PCService. ASX в файле ProjectService. WSDL

  1. На сервере бизнес-портала откройте файл ProjectService. WSDL.  Обычно это расположение находится в каталоге C:Program FilesMicrosoft DynamicsBusiness PortalApplicationsPMA.

  2. Открытие файла в блокноте

  3. Прокрутите файл вниз и найдите тег, который начинается со слова «<SOAP: Address Location =»

  4. В этом теге должен быть указан URL-адрес для файла PCService. asmx.  Он должен выглядеть примерно так: «HTTP://MachineName: 80/BUSINESSPORTAL/PMA/PCService. asmx» у этого URL-адреса есть несколько конкретных требований.  Проверьте и, при необходимости, исправьте указанные ниже элементы.

    1. URL-адрес должен указывать имя компьютера (например, BPSERVER).  IP-адреса (например, 192.168.0.10), localhost или Domain Name (например, BP.contoso.com) не будут работать для запросов SOAP.

      1. Чтобы найти имя компьютера, нажмите Пуск-> выполнить и введите CMD.

      2. Введите имя узла и нажмите клавишу ВВОД

      3. Должно быть возвращено имя компьютера.  Параметр MachineName в URL-адресе должен соответствовать этому значению.

    2. URL-адрес не должен использовать SSL.  URL-адрес должен начинаться с «http://», а не «https://»

      1. Если на вашем веб-сайте настроено использование SSL, ознакомьтесь со статьей база знаний 924723 , в которой вы узнаете, как настроить исключение, разрешающее подключение к файлу PCService. asmx без SSL.

    3. URL-адрес должен быть разрешаемым на сайте BusinessPortal в службах IIS.

      1. Это может быть вызвано тем, что при использовании заголовков узлов для различения нескольких веб-сайтов, запущенных на одном и том же сервере.

      2. Более подробную информацию вы видите в статье базы знаний 2005711 .

  5. Протестируйте URL-адрес, чтобы убедиться, что он является допустимым.  Для этого скопируйте URL-адрес и вставьте его в Internet Explorer на сервере бизнес-портала.  Он должен открыть страницу под названием «PCServices».  Если вместо этого вы получаете сообщение об ошибке SharePoint или появляется сообщение об ошибке «не удается отобразить страницу», проверьте элементы на шаге 4.

  6. Теперь, когда у файла ProjectService. WSDL есть допустимый URL-адрес, попробуйте еще раз попробовать на странице бизнес-портала

Дополнительные сведения приведены в статье база знаний 892356 или статья базы знаний 897024 .

Разрешение 7 : Проверка способа проверки подлинности в IIS

  1. На сервере бизнес-портала запустите диспетчер информационных служб Интернета (IIS).

  2. Щелкните правой кнопкой мыши веб-сайт бизнес-портала и выберите пункт Свойства.

  3. На вкладке Безопасность каталога в разделе «Управление доступом и проверка подлинности» выберите команду Изменить…

  4. Убедитесь, что установлен флажок Встроенная проверка подлинности Windows.

  5. Убедитесь, что флажок «разрешить анонимный доступ», «Краткая проверка подлинности для серверов домена Windows» и «Проверка подлинности .NET Passport» не установлены.

  6. Проверка подлинности Basic не требуется. Тем не менее, если флажок установлен, это не должно приводить к проблеме.

  7. Нажмите кнопку ОК, а затем еще раз нажмите кнопку ОК, чтобы закрыть диалоговое окно «Свойства».

  8. Закрытие диспетчера IIS

  9. Перезапустите IIS, нажав Пуск-> выполнить и введите «IISReset».

  10. Попробуйте еще раз на странице бизнес-портала

Разрешение 8 : проверка переменной sessionState в файле Web. config

  1. На сервере бизнес-портала запустите диспетчер информационных служб Интернета (IIS).

  2. Щелкните правой кнопкой мыши веб-сайт бизнес-портала и выберите пункт Свойства.

  3. На вкладке «домашний каталог» Обратите внимание на значение в поле «локальный путь».

  4. Нажмите кнопку ОК, чтобы закрыть диалоговое окно «Свойства» и выйти из диспетчера IIS

  5. Перейдите к каталогу, найденному на шаге 3, и найдите файл Web. config.

  6. Создание резервной копии файла Web. config

  7. Откройте файл web.config в блокноте.

  8. Поиск тега, который начинается с «<sessionState»

  9. Изменение всего тега для чтения «<sessionState =» INPROC «/>»

  10. Сохранение файла и закрытие блокнота

  11. Перезапустите IIS, нажав Пуск-> выполнить и введите «IISReset».

  12. Попробуйте еще раз загрузить страницы рабочего портала

 Разрешение 9 : запустите сценарий PCConnectDebug и отправьте результаты в службу поддержки. 

  1. Скачать B2004933_pcConnectDebug. zip

  2. Распаковка файла на сервере бизнес-портала

  3. Скопируйте файл «pcConnectDebug. ASP» в каталог C:Program FilesMicrosoft DynamicsBusiness PortalApplicationsPMA.

  4. На сервере бизнес-портала откройте Internet Explorer и войдите в бизнес-портал.

  5. Щелкните веб-страницу центра проектов

  6. Вставьте следующий URL-адрес, чтобы открыть страницу PCConnectDebug: http://ServerName:Port/BusinessPortal/Applications/PMA/pcconnectdebug.ASP замените значение serverName именем сервера BP.  Замените «порт» на номер порта, на котором работает веб-сайт BP.

  7. Вам будет предложено «нажмите ОК», чтобы продолжить.  Нажмите кнопку ОК.

  8. Откроется веб-страница, которая начинается с «Запуск отладки…».   В Internet Explorer щелкните файл-> сохранить как… и сохраните страницу в файле.

    1. Внимание!в зависимости от того, насколько далеко может быть предоставлена Отладка, результаты могут содержать пароль в открытом тексте.  Вы можете изменить файл в блокноте и заменить Фактический пароль на слово «thePassword» перед отправкой файла для поддержки.

  9. Отправьте этот файл службе поддержки пользователей Майкрософт для дальнейшего анализа.

  10. После устранения проблемы удалите файл pcConnectDebug. ASP из каталога C:Program FilesMicrosoft DynamicsBusiness PortalApplicationsPMA.

Error Handling with SOAP Faults

SOAP errors are handled using a specialized envelope known as a

Fault Envelope. If an error occurs
while the server processes a SOAP message, it constructs a SOAP Fault
and sends it back to the client. Here’s a typical
SOAP 1.1 Fault:

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:
xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/
XMLSchema">

<SOAP-ENV:Body>
    <SOAP-ENV:Fault>
        <faultcode>SOAP-ENV:Server</faultcode>
         <faultstring>Test Fault</faultstring>
         <faultactor>/soap/servlet/rpcrouter</faultactor>
         <detail>
            <stackTrace>[SOAPException: faultCode=SOAP-ENV:Server; msg=Test Fault]
            at StockQuantity.getQty(StockQuantity.java:21)
            at java.lang.reflect.Method.invoke(Native Method)
            at org.apache.soap.server.RPCRouter.invoke(RPCRouter.java:146)
            ...
            at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(
                ThreadPool.java:501)
            at java.lang.Thread.run(Thread.java:498)
         </stackTrace>
         </detail>
     </SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

A SOAP Fault is a special element that must appear as an immediate
child of the SOAP body element. The
<faultcode> and
<faultstring> elements are required. The
<faultactor> and
<detail> elements are optional. Table 4-1 lists the possible values for the faultcodes
and their meanings.

Table 4-1. SOAP faultcodes

Faultcode

Meaning

VersionMismatch

The SOAP node processing the request encountered a version mismatch.
The namespace identifier of the SOAP envelope determines version
compatibility.

MustUnderstand

An immediate child element of the SOAP header (i.e.,
<MessageHeader>) contained a
MustUnderstand attribute with a setting of
true or 1. The SOAP processor
was not able to recognize the element or was not capable of
processing it.

DTDNotSupported

Introduced in SOAP 1.2 Working Draft 12/17/2001. It is an error for a
SOAP 1.2 envelope to contain a DTD.

DataEncodingUnknown

The soapEncodingStyle attribute specified is
unknown or not supported. It was also introduced in SOAP 1.2 WD
12/17/2001.

Client

The content generated by the client is incorrect or malformed.
Therefore, resending the same data will result in the same error. In
SOAP 1.2, this fault is being changed to Sender.

Server

The content sent by the client is perfectly acceptable, but the SOAP
processor is unable to process it for some reason, such as an
unavailable service. Resending the message at a later time could
result in success. In SOAP 1.2, this fault is being changed to
Receiver.

The body and Fault elements are namespace-qualified to the
envelope’s namespace—for example,
<SOAP-ENV:body> and
<SOAP-ENV:Fault>. The
<faultcode> element uses the local namespace
(it has no namespace prefix), and the
<faultcode> value that the element contains
is a qualified name using the envelope’s
namespace—for example,
<faultcode>SOAP-ENV:Client</faultcode>.

The SOAP Fault from the previous listing was achieved by making a
slight modification to the StockQuantity service.
In Apache SOAP, having the service throw
an exception is all that’s needed to generate a
fault; Apache takes care of the rest:

public class StockQuantity{

  public int getQty (String item) 
    throws org.apache.soap.SOAPException {

    int inStockQty = (int)(java.lang.Math.random(  ) * (double)1000);
    
    if (item.equalsIgnoreCase("Fail"))
        throw new org.apache.soap.SOAPException   
                      (org.apache.soap.Constants.FAULT_CODE_SERVER, 
                                "Test Fault");    

    return inStockQty;
   }
...
}

In Apache SOAP 2.2, this code is all that is necessary to send a
complete SOAP 1.1 Fault message back to the sender. To view the full
output of the Fault message, redirect the
CheckStock RPC call through the TunnelGui utility
by using the command:

java CheckStock -url http://localhost:5555/soap/servlet/rpcrouter -item Fail

In this command, 5555 is the port on which the
TunnelGui is listening. The RPC request and the corresponding SOAP
Fault can be viewed in the TunnelGui window, as shown in Figure 4-1.

A SOAP Fault viewed through the Apache TunnelGui utility

Figure 4-1. A SOAP Fault viewed through the Apache TunnelGui utility

The sending client can trap the Fault programatically and take
appropriate action. Apache
SOAP has a Fault object that can be used to access
the pieces of the Fault message, as indicated in this excerpt from
CheckStock:

    //Invoke the service
    Response resp = call.invoke (url,"urn:go-do-this");

    //Check the response
    if (resp != null) {
        if (resp.generatedFault (  )) {
                        Fault fault = resp.getFault (  );
            System.out.println ("Call failed due to a SOAP Fault: ");
            System.out.println ("  Fault Code   = " + fault.getFaultCode (  ));
            System.out.println ("  Fault String = " + fault.getFaultString (  ));

While the ability to generate a fault by throwing an exception is
handy, you may want more control over what goes into a fault message.
For example, Apache SOAP, by default, puts the current stacktrace
into the <detail> element of the SOAP fault.
That may not be what you want. We will explore how to build your own
Fault message in the context of the mustUnderstand
attribute.

Soap Faults and the mustUnderstand Attribute

To appreciate the meaning and role of the
mustUnderstand or misUnderstood
fault codes, one must first understand the intent of the
mustUnderstand attribute. This attribute can be
placed in any top-level header element. The presence of the
mustUnderstand attribute with a value of
true or 1 means that the header
element must be recognizable by the receiving SOAP processor. If the
SOAP processor does not recognize or know how to process the header
element, it must generate a Fault. We can generate a header element
with a mustUnderstand attribute by adding the
following line of code to our
GenericHTTPSoapClient:

            // Create a header element in a namespace
            org.w3c.dom.Element headerElement =
                doc.createElementNS(URI,"jaws:MessageHeader");
            headerElement.setAttributeNS(URI,"SOAP-ENV:mustUnderstand","1");

            // Create subnodes within the MessageHeader
            org.w3c.dom.Element ele = doc.createElement("From");
            org.w3c.dom.Text textNode = doc.createTextNode("Me");

This code creates a SOAP envelope that looks like this:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Header>
    <jaws:MessageHeader xmlns:jaws="urn:http://oreilly/jaws/samples"
        SOAP-ENV:MustUnderstand="1" >
        <From>Me</From>
        <To>You</To>
        <MessageId>9999</MessageId>
        ...
    </jaws:MessageHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

This envelope requires the server to understand the
<MessageHeader> element. Since the server
doesn’t understand these elements, it returns a SOAP
1.1 Fault message:

<?xml version='1.0' encoding='UTF-8'?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:
xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/
XMLSchema">
    <SOAP-ENV:Body>
         <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:MustUnderstand</faultcode>
         <faultstring>Unsupported header: jaws:MessageHeader</faultstring>
         <faultactor>/examples/servlet/FaultServlet</faultactor>
         </SOAP-ENV:Fault>
     </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

The code used to generate this fault is in the following listing of
the FaultServlet class.
FaultServlet is a variation of our
HTTPReceive class. As part of the
header’s processing, we look for the existence of a
mustUnderstand attribute:

public class FaultServlet extends HttpServlet
{
...

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
    ...
           // Get the header and check it for mustunderstand
           Header header = env.getHeader(  );
           java.util.Vector headerEntries = header.getHeaderEntries(  );
                    
           screenWriter.write("nHeader==>n");
           for (java.util.Enumeration e = headerEntries.elements(  ); 
                            e.hasMoreElements(  );)
           {
               org.w3c.dom.Element el = (org.w3c.dom.Element)e.nextElement(  );
               org.apache.soap.util.xml.DOM2Writer.serializeAsXML(
                 (org.w3c.dom.Node)el, screenWriter);
                        
            // process mustUnderstand
               String mustUnderstand=
                        el.getAttributeNS(Constants.NS_URI_SOAP_ENV, 
                          "mustUnderstand");                  
               screenWriter.write("nMustUnderstand: " 
                + mustUnderstand + "n");

               String tagName = el.getTagName(  );    
               screenWriter.write("Tag Name: " + tagName + "n");

FaultServlet doesn’t support the
<MessageHeader> tag; it supports only the
<IOnlyUnderstandThis> tag. Therefore, we
must generate a fault when it sees the message header tag combined
with the mustUnderstand attribute. To construct
the fault, we create a SOAPException and use it to
create a new Fault object:

                  if(!tagName.equalsIgnoreCase("IOnlyUnderstandThis"))
                  {
                      //generate a fault.
                      screenWriter.write("Unsupported header: " + tagName + "n");
                      screenWriter.write("Generating Fault....n");
                      SOAPException se = 
                      new SOAPException(Constants.FAULT_CODE_MUST_UNDERSTAND, 
                               "Unsupported header: " + tagName);
                      Fault fault = new Fault(se);
                      fault.setFaultActorURI (request.getRequestURI (  ));
                            
                      String respEncStyle = Constants.NS_URI_SOAP_ENC;

Next, we create a Response object and supply it
with the Fault object that we created:

                      org.apache.soap.rpc.Response soapResponse = 
                      new org.apache.soap.rpc.Response (
                                 null,         // targetObjectURI
                                 null,         // methodName
                                 fault,
                                 null,         // params
                                 null,         // headers
                                 respEncStyle, // encodingStyleURI
                                 null);        // SOAPContext

Finally, we create an Envelope from the
Response object and marshall it into the
PrintWriter attached to the
servlet’s HTTPResponse:

                      Envelope faultEnvelope = soapResponse.buildEnvelope(  );  

                      org.apache.soap.encoding.SOAPMappingRegistry smr 
                           = new org.apache.soap.encoding.SOAPMappingRegistry(  );

                      PrintWriter resW = response.getWriter(  );

                      faultEnvelope.marshall(resW, smr,   
                          soapResponse.getSOAPContext(  ));
                      response.setContentType(request.getContentType(  )); 
                      response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
                      ...
                      }
                  }

Note that in the SOAP 1.2 effort, there has been much debate over
whether mustUnderstand also means
“MustExecute” or
“MustProcess.”

SOAP 1.2 clarifies the use of the SOAP header in Fault processing.
The general idea is that the body of a Fault message should contain
only the errors that resulted from processing the body of the message
that caused the Fault. Likewise, detailed information about any
errors that occur as the result of processing a header block should
be placed in the header block of the resulting Fault message. The
<Fault> and
<Faultcode> elements still appear in the
body. However, the <Misunderstood> element
in the header carries detailed information about which header element
could not be recognized.

The SOAP 1.2 Fault message (generated from not being able to
understand the <MessageHeader> element in
our previous example) would look like this:

<env:Envelope xmlns:env='http://www.w3.org/2001/09/soap-envelope'
         xmlns:f='http://www.w3.org/2001/09/soap-faults' >
    <env:Header>
        <f:misunderstood qname="jaws:MessageHeader"
            xmlns:jaws="urn:http://oreilly/jaws/samples" />
       </env:Header>
    <env:Body>
        <env:Fault>
                   <faultcode>env:mustUnderstand</faultcode>
                   <faultstring>
                One or more mandatory headers not understood
            </faultstring>
           </env:Fault>
    </env:Body>
</env:Envelope>

SOAP 1.2 adds an additional set of fault codes. These RPC fault codes
use the new namespace identifier http://www.w3.org/2001/09/soap-rpc with the
namespace prefix of rpc:. The new
codes are listed in Table 4-2.

Table 4-2. SOAP 1.2 RPC fault codes

Fault code

Meaning

rpc:ProcedureNotPresent

The server can’t find the specified procedure.

rpc:BadArguments

The server can’t parse the arguments (or the
arguments don’t match what the server is expecting
for the procedure call).

env:DataEncodingUnknown

The encodingStyle attribute contained in either
the header or body is not supported.

Hi,

My scenario is SOAP to SOAP Synchronous. I created WSDL from Id by using (http://<host>:<j2ee-port>/XISOAPAdapter/MessageServlet?channel=:<service>:<channel>. And Sender interface details.

I am testing SOAP Synchronous scenario through SOAPUI tool. When sending the requrest from SOAP UI i am getting «HTTP/1.1 500 Internal Server Error» error.

Log:

<?xml version=’1.0′?>

<!— see the documentation —>

<SOAP:Body>

<SOAP:Fault>

<faultcode>SOAP:Server</faultcode>

<faultstring>Server Error</faultstring>

<detail>

<context>XIAdapter</context>

<code>ADAPTER.JAVA_EXCEPTION</code>

<text><![CDATA[

com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn’t retrieve binding for the given channelId: Binding:CID=null;

When i test the URL in explorer its giving «OK». What will be the probelm? Pls let me know.

Regards,

Dev

Unfortunately, it seems like no matter what you try (e.g. passing array('exceptions' => 0), SoapClient() will throw an uncatchable E_ERROR on network connection issues. This bug is still present as high up as PHP 5.5.4 (REF).

Summary:

Test script:

$client=@new SoapClient('garbage',array('exceptions'=>FALSE));
echo 'OK';

Expected result: We should see «OK»,

Actual result:

If we use register_shutdown_function to display the contents of error_get_last(), we get:

Array
(
    [type] => 1
    [message] => SOAP-ERROR: Parsing WSDL: Couldn't load from 'garbage' : failed 
to load external entity "garbage"
)

To explain why you suddenly get this error without changing anything on your system, and to explain why SoapClient works on your local machine and not on your production system, it is most likely a firewall issue.

Here is what another person reported that solved his problem:

I solved my problem. It was actually an issue with my firewall. The
firewall was dropping packets sent via PHP, but via curl or wget were
not being dropped. I added a rule for all traffic from that server and
increased the packet drop length and everything is working great now!

Advice:

My best advice at this time to write some code in the same PHP file that checks if the SOAP service url resolves and loads properly before calling the SoapClient.

Что такое SOAP?

SOAP – это сокращение от Simple Object Access Protocol. Это протокол обмена сообщениями на основе XML для обмена информацией между компьютерами. SOAP является приложением спецификации XML.

Указывает на заметку

  • SOAP – это протокол связи, предназначенный для связи через Интернет.

  • SOAP может расширить HTTP для обмена сообщениями XML.

  • SOAP обеспечивает транспорт данных для веб-сервисов.

  • SOAP может обмениваться полными документами или вызывать удаленную процедуру.

  • SOAP может использоваться для трансляции сообщения.

  • SOAP не зависит от платформы и языка.

  • SOAP – это способ определения, какая информация отправляется и каким образом.

  • SOAP позволяет клиентским приложениям легко подключаться к удаленным службам и вызывать удаленные методы.

SOAP – это протокол связи, предназначенный для связи через Интернет.

SOAP может расширить HTTP для обмена сообщениями XML.

SOAP обеспечивает транспорт данных для веб-сервисов.

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

SOAP может использоваться для трансляции сообщения.

SOAP не зависит от платформы и языка.

SOAP – это способ определения, какая информация отправляется и каким образом.

SOAP позволяет клиентским приложениям легко подключаться к удаленным службам и вызывать удаленные методы.

Хотя SOAP может использоваться в различных системах обмена сообщениями и может доставляться через различные транспортные протоколы, первоначальная цель SOAP – удаленные вызовы процедур, транспортируемые через HTTP.

Другие платформы, в том числе CORBA, DCOM и Java RMI, предоставляют функциональность, аналогичную SOAP, но сообщения SOAP написаны полностью на XML и поэтому уникально независимы от платформы и языка.

SOAP – структура сообщения

SOAP-сообщение – это обычный XML-документ, содержащий следующие элементы:

  • Конверт – определяет начало и конец сообщения. Это обязательный элемент.

  • Заголовок – содержит любые необязательные атрибуты сообщения, используемые при обработке сообщения, либо в промежуточной точке, либо в конечной конечной точке. Это необязательный элемент.

  • Тело – содержит данные XML, содержащие отправляемое сообщение. Это обязательный элемент.

  • Неисправность – необязательный элемент неисправности, который предоставляет информацию об ошибках, возникающих при обработке сообщения.

Конверт – определяет начало и конец сообщения. Это обязательный элемент.

Заголовок – содержит любые необязательные атрибуты сообщения, используемые при обработке сообщения, либо в промежуточной точке, либо в конечной конечной точке. Это необязательный элемент.

Тело – содержит данные XML, содержащие отправляемое сообщение. Это обязательный элемент.

Неисправность – необязательный элемент неисправности, который предоставляет информацию об ошибках, возникающих при обработке сообщения.

Все эти элементы объявлены в пространстве имен по умолчанию для конверта SOAP – http://www.w3.org/2001/12/soap-envelope, а пространство имен по умолчанию для кодировки SOAP и типов данных – http: //www.w3 .org / 2001/12 / мыла-кодирования

ПРИМЕЧАНИЕ. – Все эти характеристики могут быть изменены. Так что продолжайте обновлять себя новейшими спецификациями, доступными на сайте W3.

Структура сообщения SOAP

Следующий блок отображает общую структуру сообщения SOAP –

<?xml version = "1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope" 
   SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">

   <SOAP-ENV:Header>
      ...
      ...
   </SOAP-ENV:Header>
   <SOAP-ENV:Body>
      ...
      ...
      <SOAP-ENV:Fault>
         ...
         ...
      </SOAP-ENV:Fault>
      ...
   </SOAP-ENV:Body>
</SOAP_ENV:Envelope>

МЫЛО – Конверт

Конверт SOAP указывает начало и конец сообщения, чтобы получатель знал, когда было получено все сообщение. Конверт SOAP решает проблему определения того, когда вы получили сообщение и готовы его обработать. Поэтому конверт SOAP – это, по сути, механизм упаковки.

Указывает на заметку

  • Каждое сообщение SOAP имеет корневой элемент Envelope.

  • Конверт является обязательной частью сообщения SOAP.

  • Каждый элемент Envelope должен содержать ровно один элемент Body.

  • Если конверт содержит элемент заголовка, он должен содержать не более одного элемента и должен отображаться как первый дочерний элемент конверта перед телом.

  • Конверт изменяется при изменении версий SOAP.

  • Конверт SOAP указывается с использованием префикса пространства имен ENV и элемента Envelope.

  • Необязательная кодировка SOAP также указывается с использованием имени пространства имен и необязательного элемента encodingStyle , который также может указывать на стиль кодирования, отличный от стиля SOAP.

  • SOAP-процессор, совместимый с v1.1, генерирует ошибку при получении сообщения, содержащего пространство имен конверта v1.2.

  • SOAP-процессор, совместимый с v1.2, генерирует ошибку VersionMismatch, если он получает сообщение, которое не включает пространство имен конверта v1.2.

Каждое сообщение SOAP имеет корневой элемент Envelope.

Конверт является обязательной частью сообщения SOAP.

Каждый элемент Envelope должен содержать ровно один элемент Body.

Если конверт содержит элемент заголовка, он должен содержать не более одного элемента и должен отображаться как первый дочерний элемент конверта перед телом.

Конверт изменяется при изменении версий SOAP.

Конверт SOAP указывается с использованием префикса пространства имен ENV и элемента Envelope.

Необязательная кодировка SOAP также указывается с использованием имени пространства имен и необязательного элемента encodingStyle , который также может указывать на стиль кодирования, отличный от стиля SOAP.

SOAP-процессор, совместимый с v1.1, генерирует ошибку при получении сообщения, содержащего пространство имен конверта v1.2.

SOAP-процессор, совместимый с v1.2, генерирует ошибку VersionMismatch, если он получает сообщение, которое не включает пространство имен конверта v1.2.

v1.2-совместимое сообщение SOAP

Ниже приведен пример сообщения SOAP, совместимого с v1.2.

<?xml version = "1.0"?>
<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope" 
   SOAP-ENV:encodingStyle = " http://www.w3.org/2001/12/soap-encoding">
   ...
   Message information goes here
   ...
</SOAP-ENV:Envelope>

SOAP с HTTP POST

В следующем примере показано использование сообщения SOAP в операции HTTP POST, которая отправляет сообщение на сервер. Он показывает пространства имен для определения схемы конверта и для определения схемы правил кодирования. Ссылка OrderEntry в заголовке HTTP – это имя программы, которая будет вызываться на веб-сайте tutorialspoint.com.

POST /OrderEntry HTTP/1.1
Host: www.tutorialspoint.com
Content-Type: application/soap; charset = "utf-8"
Content-Length: nnnn

<?xml version = "1.0"?>
<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope" 
   SOAP-ENV:encodingStyle = " http://www.w3.org/2001/12/soap-encoding">
   ...
   Message information goes here
   ...
</SOAP-ENV:Envelope>

ПРИМЕЧАНИЕ. – Привязка HTTP указывает местоположение службы.

SOAP – заголовок

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

Указывает на заметку

  • Это необязательная часть сообщения SOAP.

  • Элементы заголовка могут встречаться несколько раз.

  • Заголовки предназначены для добавления новых функций и возможностей.

  • Заголовок SOAP содержит записи заголовка, определенные в пространстве имен.

  • Заголовок закодирован как первый непосредственный дочерний элемент конверта SOAP.

  • Когда определены несколько заголовков, все непосредственные дочерние элементы заголовка SOAP интерпретируются как блоки заголовка SOAP.

Это необязательная часть сообщения SOAP.

Элементы заголовка могут встречаться несколько раз.

Заголовки предназначены для добавления новых функций и возможностей.

Заголовок SOAP содержит записи заголовка, определенные в пространстве имен.

Заголовок закодирован как первый непосредственный дочерний элемент конверта SOAP.

Когда определены несколько заголовков, все непосредственные дочерние элементы заголовка SOAP интерпретируются как блоки заголовка SOAP.

Атрибуты заголовка SOAP

Заголовок SOAP может иметь следующие два атрибута:

Атрибут актера

Протокол SOAP определяет путь сообщения как список узлов службы SOAP. Каждый из этих промежуточных узлов может выполнить некоторую обработку и затем переслать сообщение следующему узлу в цепочке. Устанавливая атрибут Actor, клиент может указать получателя заголовка SOAP.

Атрибут MustUnderstand

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

В следующем примере показано, как использовать заголовок в сообщении SOAP.

<?xml version = "1.0"?>
<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV = " http://www.w3.org/2001/12/soap-envelope"   
   SOAP-ENV:encodingStyle = " http://www.w3.org/2001/12/soap-encoding">

   <SOAP-ENV:Header>
      <t:Transaction 
         xmlns:t = "http://www.tutorialspoint.com/transaction/" 
         SOAP-ENV:mustUnderstand = "true">5
      </t:Transaction>
   </SOAP-ENV:Header>
   ...
   ...
</SOAP-ENV:Envelope>

МЫЛО – Тело

Тело SOAP является обязательным элементом, который содержит определяемые приложением данные XML, которыми обмениваются в сообщении SOAP. Тело должно содержаться в конверте и должно следовать всем заголовкам, которые могут быть определены для сообщения.

Тело определяется как дочерний элемент оболочки, а семантика для тела определяется в связанной схеме SOAP.

Тело содержит обязательную информацию, предназначенную для конечного получателя сообщения. Например –

<?xml version = "1.0"?>
<SOAP-ENV:Envelope>
   ........
   <SOAP-ENV:Body>
      <m:GetQuotation xmlns:m = "http://www.tp.com/Quotation">
         <m:Item>Computers</m:Item>
      </m:GetQuotation>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

В приведенном выше примере запрашивается расценка компьютерных комплектов. Обратите внимание, что элементы m: GetQuotation и Item выше являются специфичными для приложения элементами. Они не являются частью стандарта SOAP.

Вот ответ на вышеуказанный запрос –

<?xml version = "1.0"?>
<SOAP-ENV:Envelope>
   ........
   <SOAP-ENV:Body>
      <m:GetQuotationResponse xmlns:m = "http://www.tp.com/Quotation">
         <m:Quotation>This is Qutation</m:Quotation>
      </m:GetQuotationResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Обычно приложение также определяет схему, содержащую семантику, связанную с элементами запроса и ответа.

Сервис Quotation может быть реализован с использованием EJB, работающего на сервере приложений; в этом случае процессор SOAP будет отвечать за отображение информации тела в качестве параметров в и из реализации EJB службы GetQuotationResponse . Процессор SOAP также может отображать информацию тела в объект .NET, объект CORBA, программу COBOL и так далее.

МЫЛО – Неисправность

Если во время обработки возникает ошибка, ответ на сообщение SOAP является элементом ошибки SOAP в теле сообщения, и ошибка возвращается отправителю сообщения SOAP.

Механизм сбоя SOAP возвращает конкретную информацию об ошибке, включая предопределенный код, описание и адрес процессора SOAP, который сгенерировал сбой.

Указывает на заметку

  • Сообщение SOAP может содержать только один блок отказа.

  • Ошибка является необязательной частью сообщения SOAP.

  • Для привязки HTTP успешный ответ связан с диапазоном кодов состояния от 200 до 299.

  • Ошибка SOAP связана с диапазоном кодов состояния от 500 до 599.

Сообщение SOAP может содержать только один блок отказа.

Ошибка является необязательной частью сообщения SOAP.

Для привязки HTTP успешный ответ связан с диапазоном кодов состояния от 200 до 299.

Ошибка SOAP связана с диапазоном кодов состояния от 500 до 599.

Подэлементы неисправности

Ошибка SOAP имеет следующие подэлементы –

Sr.No Подэлемент и описание
1

<faultCode>

Это текстовый код, используемый для обозначения класса ошибок. В следующей таблице приведен список предопределенных кодов ошибок.

2

<faultString>

Это текстовое сообщение, объясняющее ошибку.

3

<faultActor>

Это текстовая строка, указывающая, кто вызвал ошибку. Это полезно, если сообщение SOAP проходит через несколько узлов в пути сообщения SOAP, и клиент должен знать, какой узел вызвал ошибку. Узел, который не действует как конечный пункт назначения, должен включать элемент faultActor .

4

<подробно>

Это элемент, используемый для передачи сообщений об ошибках приложения. Элемент detail может содержать дочерние элементы, называемые элементами detail.

<faultCode>

Это текстовый код, используемый для обозначения класса ошибок. В следующей таблице приведен список предопределенных кодов ошибок.

<faultString>

Это текстовое сообщение, объясняющее ошибку.

<faultActor>

Это текстовая строка, указывающая, кто вызвал ошибку. Это полезно, если сообщение SOAP проходит через несколько узлов в пути сообщения SOAP, и клиент должен знать, какой узел вызвал ошибку. Узел, который не действует как конечный пункт назначения, должен включать элемент faultActor .

<подробно>

Это элемент, используемый для передачи сообщений об ошибках приложения. Элемент detail может содержать дочерние элементы, называемые элементами detail.

Коды ошибок SOAP

Определенные ниже значения faultCode должны использоваться в элементе faultcode при описании неисправностей.

Sr.No Ошибка и описание
1

SOAP-ENV: VersionMismatch

Обнаружено недопустимое пространство имен для элемента конверта SOAP.

2

SOAP-ENV: MustUnderstand

Непосредственный дочерний элемент элемента Header с атрибутом mustUnderstand, установленным в «1», не был понят.

3

SOAP-ENV: Клиент

Сообщение было неправильно сформировано или содержало неверную информацию.

4

SOAP-ENV: Сервер

Возникла проблема с сервером, поэтому сообщение не удалось продолжить.

SOAP-ENV: VersionMismatch

Обнаружено недопустимое пространство имен для элемента конверта SOAP.

SOAP-ENV: MustUnderstand

Непосредственный дочерний элемент элемента Header с атрибутом mustUnderstand, установленным в «1», не был понят.

SOAP-ENV: Клиент

Сообщение было неправильно сформировано или содержало неверную информацию.

SOAP-ENV: Сервер

Возникла проблема с сервером, поэтому сообщение не удалось продолжить.

Пример ошибки SOAP

Следующий код является примером неисправности. Клиент запросил метод с именем ValidateCreditCard , но служба не поддерживает такой метод. Это представляет ошибку запроса клиента, и сервер возвращает следующий ответ SOAP –

<?xml version = '1.0' encoding = 'UTF-8'?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:xsi = "http://www.w3.org/1999/XMLSchema-instance"
   xmlns:xsd = "http://www.w3.org/1999/XMLSchema">

   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode xsi:type = "xsd:string">SOAP-ENV:Client</faultcode>
         <faultstring xsi:type = "xsd:string">
            Failed to locate method (ValidateCreditCard) in class (examplesCreditCard) at
               /usr/local/ActivePerl-5.6/lib/site_perl/5.6.0/SOAP/Lite.pm line 1555.
         </faultstring>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP – Кодировка

SOAP включает в себя встроенный набор правил для кодирования типов данных. Это позволяет сообщению SOAP указывать конкретные типы данных, такие как целые числа, числа с плавающей запятой, двойные числа или массивы.

  • Типы данных SOAP делятся на две широкие категории – скалярные типы и составные типы.

  • Скалярные типы содержат ровно одно значение, такое как фамилия, цена или описание продукта.

  • Составные типы содержат несколько значений, таких как заказ на покупку или список котировок акций.

  • Типы соединений далее подразделяются на массивы и структуры.

  • Стиль кодирования для сообщения SOAP устанавливается через атрибут SOAP-ENV: encodingStyle .

  • Чтобы использовать кодировку SOAP 1.1, используйте значение http://schemas.xmlsoap.org/soap/encoding/

  • Чтобы использовать кодировку SOAP 1.2, используйте значение http://www.w3.org/2001/12/soap-encoding

  • Последняя спецификация SOAP принимает все встроенные типы, определенные XML-схемой. Тем не менее, SOAP поддерживает свое собственное соглашение для определения конструкций, не стандартизированных XML-схемой, таких как массивы и ссылки.

Типы данных SOAP делятся на две широкие категории – скалярные типы и составные типы.

Скалярные типы содержат ровно одно значение, такое как фамилия, цена или описание продукта.

Составные типы содержат несколько значений, таких как заказ на покупку или список котировок акций.

Типы соединений далее подразделяются на массивы и структуры.

Стиль кодирования для сообщения SOAP устанавливается через атрибут SOAP-ENV: encodingStyle .

Чтобы использовать кодировку SOAP 1.1, используйте значение http://schemas.xmlsoap.org/soap/encoding/

Чтобы использовать кодировку SOAP 1.2, используйте значение http://www.w3.org/2001/12/soap-encoding

Последняя спецификация SOAP принимает все встроенные типы, определенные XML-схемой. Тем не менее, SOAP поддерживает свое собственное соглашение для определения конструкций, не стандартизированных XML-схемой, таких как массивы и ссылки.

Скалярные Типы

Для скалярных типов SOAP принимает все встроенные простые типы, указанные в спецификации XML-схемы. Это включает в себя строки, числа с плавающей запятой, двойные и целые числа.

В следующей таблице перечислены основные простые типы, взятые из XML-схемы, часть 0 – учебник http://www.w3.org/TR/2000/WD-xmlschema-0-20000407/.

Простые типы, встроенные в XML-схему
Простой тип Примеры)
строка Подтвердите, что это электрический.
логический правда, ложь, 1, 0.
поплавок -INF, -1E4, -0,0, 12,78E-2, 12, INF, NaN.
двойной -INF, -1E4, -0,0, 12,78E-2, 12, INF, NaN.
десятичный -1,23, 0, 123,4, 1000,00.
двоичный 100010
целое число -126789, -1, 0, 1, 126789.
nonPositiveInteger -126789, -1, 0.
negativeInteger -126789, -1.
долго -1, 12678967543233
ИНТ -1, 126789675
короткая -1, 12678
байт -1, 126
nonNegativeInteger 0, 1, 126789
unsignedLong 0, 12678967543233
Целочисленный Беззнаковый 0, 1267896754
unsignedShort 0, 12678
unsignedByte 0, 126
положительное число 1, 126789.
Дата 1999-05-31, — 05.
время 13: 20: 00.000, 13: 20: 00.000-05: 00

Например, вот ответ SOAP с двойным типом данных –

<?xml version = '1.0' encoding = 'UTF-8'?>
<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
   
   <SOAP-ENV:Body>
      <ns1:getPriceResponse 
         xmlns:ns1 = "urn:examples:priceservice"  
         SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">
         <return xsi:type = "xsd:double">54.99</return>
      </ns1:getPriceResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Типы соединений

Массивы SOAP имеют очень специфический набор правил, которые требуют, чтобы вы указали как тип элемента, так и размер массива. SOAP также поддерживает многомерные массивы, но не все реализации SOAP поддерживают многомерную функциональность.

Чтобы создать массив, вы должны указать его как массив xsi: type . Массив также должен включать атрибут arrayType . Этот атрибут необходим для указания типа данных для содержащихся элементов и измерений массива.

Например, следующий атрибут задает массив из 10 двойных значений –

arrayType = "xsd:double[10]"

В противоположность этому следующий атрибут задает двумерный массив строк:

arrayType = "xsd:string[5,5]"

Вот пример ответа SOAP с массивом двойных значений:

<?xml version = '1.0' encoding = 'UTF-8'?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xsd = "http://www.w3.org/2001/XMLSchema">

   <SOAP-ENV:Body>
      <ns1:getPriceListResponse 
         xmlns:ns1 = "urn:examples:pricelistservice"  
         SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">

         <return xmlns:ns2 = "http://www.w3.org/2001/09/soap-encoding"  
            xsi:type = "ns2:Array" ns2:arrayType = "xsd:double[2]">
            <item xsi:type = "xsd:double">54.99</item>
            <item xsi:type = "xsd:double">19.99</item>
         </return>
      </ns1:getPriceListResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Структуры содержат несколько значений, но каждый элемент указан с уникальным элементом доступа. Например, рассмотрим элемент в каталоге продуктов. В этом случае структура может содержать SKU продукта, название продукта, описание и цену. Вот как такая структура будет представлена ​​в сообщении SOAP:

<?xml version = '1.0' encoding = 'UTF-8'?>
<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:xsd = "http://www.w3.org/2001/XMLSchema">

   <SOAP-ENV:Body>
      <ns1:getProductResponse
         xmlns:ns1 = "urn:examples:productservice" 
         SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">
		
         <return xmlns:ns2 = "urn:examples" xsi:type = "ns2:product">
            <name xsi:type = "xsd:string">Red Hat Linux</name>
            <price xsi:type = "xsd:double">54.99</price>
            <description xsi:type = "xsd:string">
               Red Hat Linux Operating System
            </description>
            <SKU xsi:type = "xsd:string">A358185</SKU>
         </return>
      </ns1:getProductResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

ПРИМЕЧАНИЕ. – Пожалуйста, позаботьтесь о правильном отступе при написании кода SOAP. Каждый элемент в структуре указывается с уникальным именем доступа. Например, вышеприведенное сообщение включает в себя четыре элемента доступа – имя, цена, описание и артикул. Каждый элемент может иметь свой собственный тип данных. Например, имя указывается как строка, а цена указывается как двойная.

МЫЛО – Транспорт

SOAP не привязан ни к какому транспортному протоколу. SOAP может транспортироваться через SMTP, FTP, IBM MQSeries или Microsoft Message Queuing (MSMQ).

Спецификация SOAP содержит подробности только по HTTP. HTTP остается самым популярным транспортным протоколом SOAP.

SOAP через HTTP

Логично, что SOAP-запросы отправляются через HTTP-запрос, а SOAP-ответы возвращаются в содержимом HTTP-ответа. Хотя запросы SOAP можно отправлять через HTTP GET, в спецификации содержатся сведения только о HTTP POST.

Кроме того, как HTTP-запросы, так и ответы требуются для установки типа контента text / xml.

Спецификация SOAP требует, чтобы клиент предоставил заголовок SOAPAction, но фактическое значение заголовка SOAPAction зависит от реализации сервера SOAP.

Например, чтобы получить доступ к службе перевода AltaVista BabelFish, размещенной в XMethods, в качестве заголовка SOAPAction необходимо указать следующее.

urn:xmethodsBabelFish#BabelFish

Даже если серверу не требуется полный заголовок SOAPAction, клиент должен указать пустую строку (“”) или нулевое значение. Например –

SOAPAction: ""
SOAPAction:

Вот пример запроса, отправленного через HTTP в службу перевода XMethods Babelfish:

POST /perl/soaplite.cgi HTTP/1.0
Host: services.xmethods.com
Content-Type: text/xml; charset = utf-8
Content-Length: 538
SOAPAction: "urn:xmethodsBabelFish#BabelFish"

<?xml version = '1.0' encoding = 'UTF-8'?>
<SOAP-ENV:Envelope 
   xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/" 
   xmlns:xsi = "http://www.w3.org/1999/XMLSchema-instance"
   xmlns:xsd = "http://www.w3.org/1999/XMLSchema">

   <SOAP-ENV:Body>
      <ns1:BabelFish
         xmlns:ns1 = "urn:xmethodsBabelFish"
         SOAP-ENV:encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/">
         <translationmode xsi:type = "xsd:string">en_fr</translationmode>
         <sourcedata xsi:type = "xsd:string">Hello, world!</sourcedata>
      </ns1:BabelFish>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Обратите внимание на тип содержимого и заголовок SOAPAction. Также обратите внимание, что метод BabelFish требует двух параметров String. Режим перевода en_fr переводит с английского на французский.

Вот ответ от XMethods –

HTTP/1.1 200 OK
Date: Sat, 09 Jun 2001 15:01:55 GMT
Server: Apache/1.3.14 (Unix) tomcat/1.0 PHP/4.0.1pl2
SOAPServer: SOAP::Lite/Perl/0.50
Cache-Control: s-maxage = 60, proxy-revalidate
Content-Length: 539
Content-Type: text/xml

<?xml version = "1.0" encoding = "UTF-8"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENC = "http://schemas.xmlsoap.org/soap/encoding/"
   SOAP-ENV:encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
   xmlns:xsi = "http://www.w3.org/1999/XMLSchema-instance"
   xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:xsd = "http://www.w3.org/1999/XMLSchema">
   
   <SOAP-ENV:Body>
      <namesp1:BabelFishResponse xmlns:namesp1 = "urn:xmethodsBabelFish">
         <return xsi:type = "xsd:string">Bonjour, monde!</return>
      </namesp1:BabelFishResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Ответы SOAP, доставляемые через HTTP, должны следовать тем же кодам состояния HTTP. Например, код состояния 200 OK указывает на успешный ответ. Код состояния 500 Internal Server Error указывает, что произошла ошибка сервера и что ответ SOAP содержит элемент Fault.

SOAP – Примеры

В приведенном ниже примере запрос GetQuotation отправляется на сервер SOAP через HTTP. Запрос имеет параметр QuotationName , и в ответе будет возвращено предложение.

Пространство имен для функции определяется по адресу http://www.xyz.org/quotation .

Вот SOAP-запрос –

POST /Quotation HTTP/1.0
Host: www.xyz.org
Content-Type: text/xml; charset = utf-8
Content-Length: nnn

<?xml version = "1.0"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
   SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">

   <SOAP-ENV:Body xmlns:m = "http://www.xyz.org/quotations">
      <m:GetQuotation>
         <m:QuotationsName>MiscroSoft</m:QuotationsName>
      </m:GetQuotation>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Соответствующий SOAP-ответ выглядит так:

HTTP/1.0 200 OK
Content-Type: text/xml; charset = utf-8
Content-Length: nnn

<?xml version = "1.0"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
   SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">

   <SOAP-ENV:Body xmlns:m = "http://www.xyz.org/quotation">
      <m:GetQuotationResponse>
         <m:Quotation>Here is the quotation</m:Quotation>
      </m:GetQuotationResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP – Стандарты

SOAP 1.1 был первоначально представлен W3C в мае 2000 года. Официальными представителями были крупные компании, такие как Microsoft, IBM и Ariba, а также небольшие компании, такие как UserLand Software и DevelopMentor.

В июле 2001 года рабочая группа по протоколу XML выпустила «рабочий проект» SOAP 1.2. В рамках W3C этот документ официально находится в стадии разработки, что означает, что документ, вероятно, будет обновляться много раз, прежде чем будет завершен.

SOAP версии 1.1 доступен в Интернете по адресу http://www.w3.org/TR/SOAP/.

Рабочий проект SOAP версии 1.2 доступен по адресу http://www.w3.org/TR/soap12/.

Обратите внимание, что W3C также содержит представление для «SOAP-сообщений с вложениями», которое отделено от основной спецификации SOAP. Эта спецификация позволяет сообщениям SOAP включать двоичные вложения, такие как изображения и звуковые файлы. Для получения полной информации см. Примечание W3C по адресу http://www.w3.org/TR/SOAP-attachments .

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ятрогенная патология врачебные ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка snowshoe ea8151f far cry new dawn