0

我正在为给定的客户端开发一个 ASP.NET Web 服务(不是 WCF)。这是其中一种情况,您无法在客户端更改任何内容。

客户端发送以下 XML 来请求方法:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                   xmlns:cometxsd="http://werk-ii.de/soap/comet/Schema"
                   xmlns:comet="http://werk-ii.de/soap/comet"
                   xmlns:xop="http://www.w3.org/2004/08/xop/include"
                   xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
                   xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
                   xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
                   xmlns:xmime5="http://www.w3.org/2005/05/xmlmime"
                   xmlns:ns1="http://soap.comet.werkii.com/">
  <SOAP-ENV:Body>
    <ns1:login xsi:type="ns1:login">
      <user>myusername</user>
      <password>mypassword</password>
      <client>whatever</client>
      <language>de</language>
    </ns1:login>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我的服务提供了这样的登录方法:

[WebService(Namespace = "http://soap.comet.werkii.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class CometService : WebService
{
    [WebMethod(MessageName = "login")]
    [return: XmlElement("return")]
    public LoginResult Login (string user, string password, string client, string language)
    {
        return new LoginResult() {
            ResultCode = 0,
            SessionId = user + "-" + password + "-" + client + "-" + language
        };
    }
}

public class LoginResult
{
    [XmlElement("resultCode")]
    public int ResultCode { get; set; }

    [XmlElement("sessionId")]
    public string SessionId { get; set; }
}

如果我启动服务,它会告诉我必须作为请求发送哪些 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>
    <login xmlns="http://soap.comet.werkii.com/">
      <user>string</user>
      <password>string</password>
      <client>string</client>
      <language>string</language>
    </login>
  </soap:Body>
</soap:Envelope>

当我从另一个测试客户端(我用 PHP 编写的)使用此代码时(如服务所告知的那样),一切正常,我得到了结果。但是当我从头发送代码时(这是真正的客户端将发送的),该方法被调用但所有 4 个参数都是 null

从 XML 的角度来看,我认为这两个请求是相同的。唯一的区别是,命名空间的定义位置以及元素是否使用 ns1 前缀。当服务将其读取为 XML 时,这不会产生任何影响。也许我错了。

也许第一个 XML 中的 4 个参数与方法 (ns1) 具有不同的命名空间 (none)。这可能是所有论点都为空的原因吗?我将如何仅更改参数的命名空间?

当我只更改 XML 中的方法行时 - 替换<ns1:login xsi:type="ns1:login"><login xmlns="http://soap.comet.werkii.com/">结束标记 - 它有效!所以服务似乎不理解我的请求,如果方法元素使用命名空间前缀,尽管命名空间在根元素中正确定义。

我尝试了以下方法来更改服务期望的 XML 格式:

  • System.Web.Services.Protocols.SoapDocumentMethodAttribute - 完全没有效果
  • XmlNamespaceDeclarationsAttribute 如此处所示-似乎不起作用,因为它用于操作复杂类型,而不是服务类或方法

所以问题是,我如何告诉我的服务接受第一个示例中的 XML?

4

1 回答 1

1

很高兴知道参数也可以有属性:

public LoginResult Login (
    [XmlElement(Namespace = "")] string user,
    [XmlElement(Namespace = "")] string password,
    [XmlElement(Namespace = "")] string client,
    [XmlElement(Namespace = "")] string language)
{
    return new LoginResult() {
        ResultCode = 0,
        SessionId = user + "-" + password + "-" + client + "-" + language
    };
}

这就是将参数放入全局命名空间的解决方案——问题解决了。

于 2013-11-20T10:04:36.577 回答