Запрос 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 в построителе отчетов. И, конечно, этот обходной путь не помог бы, если бы я не мог изменить веб-сервис.