Запрос XMLDP с параметром массива строк - построитель отчетов

У меня есть источник данных XML в отчете, указывающий на мой веб-сервис на C#. Я не знаю, как правильно передать массив строк в качестве значения параметра в запросе к этому источнику данных.

<Query>
   <Method Name="MyAwesomeMethod" Namespace="http://myawesomenamespace">
   <Parameters>
      <Parameter Name="regularParameter" Type="String">
         <DefaultValue>a normal string value</DefaultValue>
      </Parameter>
      <Parameter Name="fields">
         <DefaultValue><!-- what to put here? --></DefaultValue>
      </Parameter>
   </Parameters>
   </Method>
   <ElementPath IgnoreNamespaces="true">*</ElementPath>
</Query>

В обычном запросе SOAP у меня будет следующее:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mynamespace="http://myawesomenamespace">
   <soapenv:Header/>
   <soapenv:Body>
      <mynamespace:MyAwesomeMethod>
         <mynamespace:regularParameter>a normal string value</mynamespace:regularParameter>
         <mynamespace:fields>
            <mynamespace:string>value the first</mynamespace:string>
            <mynamespace:string>value the second</mynamespace:string>
         </mynamespace:fields>
      </mynamespace:MyAwesomeMethod>
   </soapenv:Body>
</soapenv:Envelope>

Мой веб-сервис дает пример запроса SOAP 1.1:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <MyAwesomeMethod xmlns="http://myawesomenamespace">
      <regularParameter>string</regularParameter>
      <fields>
        <string>string</string>
        <string>string</string>
      </fields>
    </MyAwesomeMethod>
  </soap:Body>
</soap:Envelope>

Так как же передать массив строк в качестве значения по умолчанию в параметре запроса XMLDP? Это связано с моим другим вопросом, но не таким же.

2 ответа

Массивы простых типов представлены так же, как они сериализуются с классом XmlSerializer в.NET.

Вы можете использовать код ниже, чтобы увидеть сериализацию:

string[] example = new string[] {"One", "Two", "Three"};
string serializedExample = null;
XmlSerializer serializer = new XmlSerializer(typeof(string[]));

using (StringWriter writer = new StringWriter())
{
    serializer.Serialize(writer, example);
    serializedExample = writer.ToString();
}

Console.WriteLine(serializedExample);

Код производит этот вывод:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <string>One</string>
  <string>Two</string>
  <string>Three</string>
</ArrayOfString>

Представляя это в качестве параметра, не включайте <?xml version="1.0" encoding="utf-16"?>, Вы также можете опустить xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" без вредных последствий.

Это должно дать вам:

<Query>
   <Method Name="MyAwesomeMethod" Namespace="http://myawesomenamespace">
   <Parameters>
      <Parameter Name="regularParameter" Type="String">
         <DefaultValue>a normal string value</DefaultValue>
      </Parameter>
      <Parameter Name="fields" Type="Xml">
         <DefaultValue><ArrayOfString><string>One</string><string>Two</string><string>Three</string></ArrayOfString></DefaultValue>
      </Parameter>
   </Parameters>
   </Method>
   <ElementPath IgnoreNamespaces="true">*</ElementPath>
</Query>

Если это не сработает, попробуйте удалить ArrayOfString теги. Важной частью является то, что ваш тип параметра должен быть Xml.

Обходной путь, поскольку я контролирую код веб-службы, заключается в изменении моих веб-методов, чтобы они принимали только простые параметры, такие как string fields вместо string[] fields, Тогда я использую new Regex(@"([0-9a-zA-Z]+)(,\s*[0-9a-zA-Z]+)*") чтобы убедиться, что список полей через запятую был передан и fields.Split(',').Select(str => str.Trim()).ToArray() чтобы получить string[] как я и хотел.

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

Другие вопросы по тегам