Пользовательский SOAP-соединитель Azure SOAP-REST с ошибкой приложений логики на дату - PullRequest
0 голосов
/ 19 марта 2019

У меня есть настраиваемый соединитель Azure к SOAP API, который настроен с SOAP на REST. Один из методов имеет datetime в качестве ввода:

Я генерирую DateTime со следующим выражением:

formatDateTime(addDays(utcNow(), -1), 's')

Со следующим необработанным вводом из приложений логики я получаю исключение формата даты и времени

{
"method": "post",
"path": "/MethodWithDates",
"retryPolicy": {
    "type": "None"
},
"body": {
    "MethodWithDates": {
        "timefrom": "2019-03-18T15:59:03",
        "timeto": "2019-03-19T15:59:03"
    }
}

Сообщение об ошибке из API:

The value '3/18/2019 3:59:03 PM' cannot be parsed as the type 'DateTime'.'

Обратите внимание, как формат даты и времени изменился с необработанного вывода на полученный в API. Это наводит меня на мысль, что пользовательский соединитель как-то меняет формат времени.

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

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:MethodWithDates>
         <tem:timefrom>2019-03-18T15:13:31</tem:timefrom>
         <tem:timeto>2019-03-19T15:13:31</tem:timeto>
      </tem:MethodWithDates>
   </soapenv:Body>
</soapenv:Envelope>

Интересно, что это происходит только для спецификатора формата "s", если я форматирую значение любым другим способом, через которое оно передается в указанном мной формате. Я по-прежнему получаю сообщение об ошибке в API, так как это API-интерфейс WCF, и, похоже, требуется формат "s"

Ответы [ 2 ]

1 голос
/ 21 марта 2019

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

Я могу выполнить эту работу, изменив поля ввода Datetime в Soap Service.string.

Неработающий код службы SOAP:

public string GetDaysBetweenDates(DateTime timefrom, DateTime timeto)
{
  double value = (timeto - timefrom).TotalDays;
  return string.Format("Difference is: {0}", value);
}

Рабочий код WSDL

public string GetDaysBetweenDates(string timefrom, string timeto)
{
  DateTime fromdate = DateTime.Parse(timefrom);
  DateTime toDate = DateTime.Parse(timeto);
  double value = (fromdate - toDate).TotalDays;
  return string.Format("Difference is: {0}", value);
}
0 голосов
/ 27 марта 2019

u / KetanChawda-MSFT ответ достаточно хорош, если вы действительно можете изменить веб-сервис, но так как это было вне нашего контроля над этим, нам пришлось сделать что-то еще.

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

Соединитель имеет один метод, настроенный следующим образом, с API WCF по умолчанию:

  1. URL - http://hostname/Service1.svc/SoapPassThrough
  2. Добавьте два пользовательских заголовка: текст / xml типа контента и имя метода SOAPAction (наш: http://tempuri.org/IService1/methodname, где tempuri - пространство имен
  3. Установить тело в {} (пустой объект JSON)

В приложении логики вы можете создать переменную, содержащую весь XML-код для стандартного запроса мыла. Я использовал SOAP UI для создания запроса SOAP и просто вставил его в XML из сгенерированного запроса. Эта переменная может использоваться как тело в приложении логики, когда вы используете сервис.

Этот ресурс может быть полезен для этого: https://blogs.msdn.microsoft.com/david_burgs_blog/2018/05/03/friendlier-soap-pass-through-with-logic-app-designer-ux/

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...