OcppV1.5 по ошибке Soap: Действие не существует

#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 действительно очень помог решить эту проблему. 😀