Задача процесса SSIS для сценария Powershell, выполняющего вызов SOAP

#xml #powershell #soap #ssis

#xml #powershell #soap #ssis

Вопрос:

После долгих часов изучения проблемы я столкнулся с чем-то вроде стены. По сути, я пытаюсь выполнить вызов SOAP для открытой веб-службы (для которой у меня есть WSDL). Я могу запустить свой сценарий PowerShell для выполнения вызова и возвращает результат XML. У меня возникли проблемы с подключением к SSIS и передачей этого XML для анализа. Я прочитал статьи, объясняющие выполнение этого через веб-сервис (который я получаю с сообщением об ошибке при webmethod) и задачу сценария / процесса.

В настоящее время работаю с задачей процесса, которая вызывает сценарий PowerShell для выполнения вызова SOAP и получения XML-ответа, который я могу проанализировать и вставить в таблицу SQL

Задача процесса / веб-сервиса / сценария VB-код (не владеющий) PowerShell для сохранения ответа в файл и вставки в SQL

 #setting TLS to 1.2 as webservice rejects 1.0
[System.Net.ServicePointManager]::SecurityProtocol = 
[System.Net.SecurityProtocolType]::Tls12

#setting URL Endpoint
$uri = "WebserviceURL"

#structuring the request with the infile being the soap action with headers
$post = Invoke-WebRequest -Uri $uri -InFile c:SOAPREQUESTACTION -ContentType "text/xml" -method post`
  

Ожидаемые результаты — служба SSIS может анализировать XML-ответ в переменные и вставлять в таблицу SQL, после чего она обновит элементы по мере изменения атрибутов при следующем вызове SOAP

пример ответа

 <?xml version='1.0' encoding='UTF-8'?><env:Envelope 
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body> 
<wd:Report_Data xmlns:wd="WEBSERVICEURN">
<wd:Report_Entry>
<wd:Preferred_Name_-_First_Name>Joe</wd:Preferred_Name_-_First_Name>
<wd:Preferred_Name_-_Last_Name>Professional</wd:Preferred_Name_- 
_Last_Name>
<wd:businessTitle>Joe Professional Title</wd:businessTitle>
<wd:Department wd:Descriptor="Joes Professional Department">
</wd:Report_Entry></wd:Report_Data></env:Body></env:Envelope>
  

Комментарии:

1. Вы пробовали просто использовать New-WebServiceProxy

2. у меня есть, powershell sciprt работает, больше касается использования в SSIS. Я смог получить ответ на переменную, но не уверен, как вызвать и проанализировать переменную, однажды использованную в SSIS

3. Вставьте XML-ответ в свой вопрос. Я могу рассказать вам, как обрабатывать эту строку

4. @KeithL в OP добавлен ответ XML, проверьте это

Ответ №1:

Прежде всего, мне пришлось очистить ваш XML, чтобы:

 <?xml version='1.0' encoding='UTF-8'?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body> 
<wd:Report_Data xmlns:wd="WEBSERVICEURN">
<wd:Report_Entry>
<wd:Preferred_Name_-_First_Name>Joe</wd:Preferred_Name_-_First_Name>
<wd:Preferred_Name_-_Last_Name>Professional</wd:Preferred_Name_-_Last_Name>
<wd:businessTitle>Joe Professional Title</wd:businessTitle>
<wd:Department wd:Descriptor="Joes Professional Department"/>
</wd:Report_Entry></wd:Report_Data></env:Body></env:Envelope>
  

Я предполагаю, что он загружен в файл. Я вызвал этот файл xml.txt

  1. Добавьте поток данных
  2. В потоке данных добавьте компонент сценария (источник)
  3. Добавьте свои столбцы в выходные данные
  4. Редактировать сценарий
  5. Добавить в пространства имен
  6. использование System.Xml.Serialization;
  7. использование системы.Коллекции.Общий;
  8. добавьте следующий код для CreateOutputRows()

     var xml = System.IO.File.ReadAllBytes(@"D:tempxml.txt");
    System.IO.Stream s_xml = new System.IO.MemoryStream(xml);
    
    XmlSerializer serializer = new XmlSerializer(typeof(Envelope));
    var results = (Envelope)serializer.Deserialize(s_xml);
    foreach (var entry in results.Body.Report_Data.Report_Entry)
    {
        Output0Buffer.AddRow();
        Output0Buffer.fname = entry.Preferred_Name__First_Name;
        Output0Buffer.lname = entry.Preferred_Name__Last_Name;
        Output0Buffer.title = entry.BusinessTitle;
        Output0Buffer.dept = entry.Department.Descriptor;
    }
    s_xml.Close();
      
  9. Используйте веб-сайт, подобный xml2csharp.com чтобы преобразовать xml в классы и вставить классы ниже:

      [XmlRoot(ElementName = "Department", Namespace = "WEBSERVICEURN")]
     public class Department
     {
          [XmlAttribute(AttributeName = "Descriptor", Namespace = "WEBSERVICEURN")]
          public string Descriptor { get; set; }
     }
    
     [XmlRoot(ElementName = "Report_Entry", Namespace = "WEBSERVICEURN")]
     public class Report_Entry
     {
          [XmlElement(ElementName = "Preferred_Name_-_First_Name", Namespace = "WEBSERVICEURN")]
          public string Preferred_Name__First_Name { get; set; }
          [XmlElement(ElementName = "Preferred_Name_-_Last_Name", Namespace = "WEBSERVICEURN")]
          public string Preferred_Name__Last_Name { get; set; }
          [XmlElement(ElementName = "businessTitle", Namespace = "WEBSERVICEURN")]
          public string BusinessTitle { get; set; }
          [XmlElement(ElementName = "Department", Namespace = "WEBSERVICEURN")]
          public Department Department { get; set; }
     }
    
     [XmlRoot(ElementName = "Report_Data", Namespace = "WEBSERVICEURN")]
     public class Report_Data
     {
           [XmlElement(ElementName = "Report_Entry", Namespace = "WEBSERVICEURN")]
           public List<Report_Entry> Report_Entry { get; set; }
           [XmlAttribute(AttributeName = "wd", Namespace = "http://www.w3.org/2000/xmlns/")]
           public string Wd { get; set; }
      }
    
      [XmlRoot(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
      public class Body
      {
           [XmlElement(ElementName = "Report_Data", Namespace = "WEBSERVICEURN")]
           public Report_Data Report_Data { get; set; }
      }
    
      [XmlRoot(ElementName = "Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
      public class Envelope
      {
            [XmlElement(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
            public Body Body { get; set; }
            [XmlAttribute(AttributeName = "env", Namespace = "http://www.w3.org/2000/xmlns/")]
            public string Env { get; set; }
      }
      
  10. Сохраните и завершите

  11. Теперь у вас есть свои столбцы в потоке данных, с которыми вы можете делать все, что захотите.