我遇到了用C#编写的webservice的问题。它工作正常,直到我想调用带参数的方法,使用我的wsdl从外部供应商生成的SOAP请求如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://127.0.0.1/AService</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">ANameSpace/login</Action>
</s:Header>
<soapenv:Body>
<ns1:login soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="ANameSpace">
<a_sDMSUserName xsi:type="xsd:string">test</a_sDMSUserName>
<a_sDMSUserPassword xsi:type="xsd:string">oscar</a_sDMSUserPassword>
</ns1:login>
</soapenv:Body>
</soapenv:Envelope>
这是我服务界面的一部分:
[ServiceContract (Namespace ="ANameSpace")]
public interface IFordEcat
{
[OperationContract (Action ="ANameSpace/connect")]
int connect();
[OperationContract(Action = "ANameSpace/disconnect")]
int disconnect();
[OperationContract(Action = "ANameSpace/login")]
string login(string a_sDMSUserName, string a_sDMSUserPassword);
[OperationContract(Action = "ANameSpace/logout")]
string logout(string a_sSessionID, string a_sDMSUserName, string a_sDMSUserPassword);
使用SoapUI或通过服务引用在C#中设置测试客户端,它可以正常工作。
唯一的问题是login Method或带参数的任何其他Method的参数缺少传递参数的节点中的名称空间前缀(nsl)。当我手动添加它们时,例如在SOAPUi中,它就像魅力一样。有没有办法添加名称空间前缀而不检查每个传入的请求?
非常感谢提前!
答案 0 :(得分:1)
我有点不确定为什么必须提供Action属性,因为SOAP操作可以在没有它的情况下工作。也许有线索......?
或者,如果您希望保留它并希望为每个请求添加命名空间,那么您可以探索XmlDocument类和XmlNode类。这里有一个简单的代码片段,可以在特定节点添加命名空间 -
"fa-circle-o"