ASP.NET改变SOAP主体

时间:2012-05-17 13:35:43

标签: asp.net web-services asmx

我在.NET中有一个Web服务,它以数组作为输入。该服务的请求是sens as

<soap:Body>
<DisplayNames xmlns="http://tempuri.org/">
  <Names>
    <Name>
      <FirstName>string</FirstName>
      <LastName>string</LastName>
    </Name>
    <Name>
      <FirstName>string</FirstName>
      <LastName>string</LastName>
    </Name>
  </Names>
</DisplayNames>

可以删除父标记(NAMES)并发出如下所示的请求吗?

<soap:Body>
<DisplayNames xmlns="http://tempuri.org/">
    <Name>
      <FirstName>string</FirstName>
      <LastName>string</LastName>
    </Name>
    <Name>
      <FirstName>string</FirstName>
      <LastName>string</LastName>
    </Name>
</DisplayNames>

2 个答案:

答案 0 :(得分:1)

如果您的意思是改变Web服务的工作方式,以便客户端不必以这种方式发送,而不是使用现有工具。它与XML如何映射回代码函数有关。

我不确切地知道你的函数在代码隐藏中的样子,但是从XML我可以假设它看起来像这样(猜测返回值)

[WebMethod]
private bool DisplayNames(Name[] Names)
{
   ...
}

这个特殊的服务必须采用一系列名称。 <Names>标记指定了一个输入参数。运行时将此识别为期望的名称参数,并能够将其解析出来。如果所有Web服务仅使用一个数组参数,那么您所考虑的可能会有用。

我不知道这是否有意义,但是为了说明此Web服务还采用名为“IgnoreErrors”的布尔值。

[WebMethod]
private bool DisplayNames(Name[] Names, bool IgnoreErrors)
{
   ...
}

XML将如下所示:

<soap:Body>
<DisplayNames xmlns="http://tempuri.org/">
  <Names>
    <Name>
      <FirstName>string</FirstName>
      <LastName>string</LastName>
    </Name>
    <Name>
      <FirstName>string</FirstName>
      <LastName>string</LastName>
    </Name>
  </Names>
  <ShowErrors>
    <value>false</value>
  </ShowErrors>
</DisplayNames>

现在,如果你要做你要求的,删除标签,它将如下所示:

<soap:Body>
<DisplayNames xmlns="http://tempuri.org/">
  <Name>
      <FirstName>string</FirstName>
      <LastName>string</LastName>
  </Name>
  <Name>
      <FirstName>string</FirstName>
      <LastName>string</LastName>
  </Name>
  </Names>
  <ShowErrors>
    <value>false</value>
  </ShowErrors>
</soap:Body>

当你看到它时,尝试描绘函数签名在代码隐藏中的外观。而不是一个数组和一个布尔值,现在看起来像两个字典和一个布尔值。

所以,所有这些都说,<Name>标记再次标识了代码隐藏函数中的Name参数。

答案 1 :(得分:1)

更改了我的方法

来自

  

[的WebMethod]       public string DisplayNames(Name [] NameCollection)       {

  

[的WebMethod]       public string DisplayNames([XmlElement(“Names”)] Name [] NameCollection)       {