0

我在报告中有一个 XML 数据源,指向我的 C# Web 服务。我不知道如何正确地将字符串数组作为查询中的参数值传递给该数据源。

<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>

我的 Web 服务提供了一个示例 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 查询参数中的默认值传递呢?这与我的另一个问题有关,但不一样。

4

2 回答 2

0

简单类型数组的表示方式与它们在 .NET 中使用XmlSerializer 类进行序列化的方式相同。

您可以使用下面的代码来查看序列化:

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。

于 2013-02-27T19:01:07.710 回答
0

由于我控制了 Web 服务代码,因此解决方法是更改​​我的 Web 方法,以便它们只采用简单的参数,例如string fields而不是string[] fields. 然后我new Regex(@"([0-9a-zA-Z]+)(,\s*[0-9a-zA-Z]+)*")用来确保通过逗号分隔的字段列表并fields.Split(',').Select(str => str.Trim()).ToArray()获得string[]我想要的。

这可行,但看起来很愚蠢,因为在某处肯定存在一些语法,允许将字符串数组传递给 Report Builder 中的 XML Web 服务。当然,如果我无法更改 Web 服务,这种变通方法将毫无帮助。

于 2012-04-13T16:46:54.217 回答