#c# #http #soap #https #protocols
Вопрос:
в настоящее время я создаю клиента для связи со шлюзом Точки зарядки.
Связь строится с помощью OcppV1.5 по протоколу Soap и Http.
Сервер не принимает мой запрос. Я получаю Http-ответ 500 с причиной ошибки:
«XML-запрос плохо сформирован, действие не существует».
Я заглянул в файлы wsdl, но я просто не понимаю, почему он не принимает мои действия.
Моя просьба выглядит примерно так:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="https://www.w3.org/2005/08/addressing" xmlns:cs="urn://Ocpp/Cp/2012/06/">
<SOAP-ENV:Header>
<cs:chargeBoxIdentity>0000.0000</cs:chargeBoxIdentity>
<wsa:From>
<wsa:Address>http://000.000.000.000:0000</wsa:Address>
</wsa:From>
<wsa:To>http://000.000.000.001:0001</wsa:To>
<wsa:Action>/ChangeConfiguration</wsa:Action>
<wsa:MessageID>00000.000000000000</wsa:MessageID>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<cs:changeConfigurationRequest>
<cs:key>MeterValueSampleInterval</cs:key>
<cs:value>60</cs:value>
</cs:changeConfigurationRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Обновить:
Как и предлагал Богдан, я попытался отправить то же самое сообщение с помощью SoapUI, и это сработало. Сгенерированный запрос от SoapUI выглядит следующим образом:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="urn://Ocpp/Cp/2012/06/">
<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<ns:chargeBoxIdentity>000000.00000</ns:chargeBoxIdentity>
<wsa:Action>/ChangeConfiguration</wsa:Action>
<wsa:ReplyTo>
<wsa:Address>http://000.000.000.000:0000</wsa:Address>
</wsa:ReplyTo>
<wsa:MessageID>uuid:00000000-0000-0000-0000-000000000000</wsa:MessageID>
<wsa:To>http://000.000.000.000:00000/</wsa:To>
</soap:Header>
<soap:Body>
<ns:changeConfigurationRequest>
<ns:key>MeterValueSampleInterval</ns:key>
<ns:value>300</ns:value>
</ns:changeConfigurationRequest>
</soap:Body>
</soap:Envelope>
Комментарии:
1. Вы уверены, что запрос SOAP правильно отформатирован? Кроме того, в сообщении говорится «Действие». Есть ли у вас параметр действия в вашем типе контента? ietf.org/rfc/rfc3902.txt
2. Нет, я не совсем уверен, вот почему я ищу помощи. Я не понимаю, что вы имеете в виду под типом контента. Но я определяю действие как «/Изменение конфигурации», которое определено в пространстве имен «urn://Ocpp/Cp/2012/06/», который определен в запросе. Таким образом, сервер должен быть в состоянии понять действие, но по какой-то причине этого не происходит… Запросы, которые я получил от сервера (другого типа действия), на который я пытаюсь отправить, были построены таким же образом…
Ответ №1:
Из того, что вы опубликовали, трудно понять, почему вы получаете ошибку, поэтому я могу добавить только некоторую информацию, которая, надеюсь, позволит вам устранить проблему.
Ваше сообщение содержит заголовки WS-адресации, <wsa:Action>
которые являются одним из них. Значение этого поля должно быть указано в WSDL, если ваш WSDL также содержит метаданные WS-адресации, или должно быть указано в документации веб-службы, которую вы вызываете. Ваше сообщение об ошибке «XML-запрос неправильно сформирован, действие не существует», по-видимому, указывает на то, что с этим полем может возникнуть проблема, но есть еще одно действие, выполняемое службами SOAP, которое является действием SOAP. Я спросил об этом в комментарии выше, чтобы убедиться, что это устранено как источник проблем. В МЫЛЕ 1.1 он называется SOAPAction
и является отдельным заголовком HTTP, в то время как в SOAP 1.2 это action
параметр в заголовке HTTP Content-Type
. В зависимости от http://www.w3.org/2003/05/soap-envelope
пространства имен у вас есть сообщение SOAP 1.2.
С этими изложенными объяснениями я предлагаю вам взять WSDL и передать его SoapUI, который может генерировать примеры запросов, которые вы можете использовать для вызова веб-службы. Если WSDL также содержит метаданные WS-адресации, SoapUI должен иметь возможность их получить и помочь вам заполнить необходимые значения. Если нет, еще раз просмотрите WSDL для Action
элементов (убедитесь, что вы различаете действие SOAP и действие WS-адресации, используя их пространства имен XML) или в документации по сервису.
Как только вы получите успешный вызов с помощью SoapUI, попробуйте продублировать его своим кодом. В этот момент вы можете снова использовать SoapUI для устранения неполадок и проверить созданное вами сообщение, чтобы увидеть, что оно похоже на то, которое вы можете успешно отправить с помощью SoapUI.
Надеюсь, это поможет вам приблизиться к решению.
Комментарии:
1. большое вам спасибо за вашу помощь. Инструмент SoapUI действительно очень помог решить эту проблему. 😀