我正在为给定的客户端开发一个 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?