C#SOAP服务在方法参数上缺少命名空间
我用C#编写的Web服务遇到了问题。它工作正常,直到我想用参数调用方法,使用我的wsdl从外部供应商生成的SOAP请求如下所示:C#SOAP服务在方法参数上缺少命名空间,c#,wcf,soap,namespaces,C#,Wcf,Soap,Namespaces,我用C#编写的Web服务遇到了问题。它工作正常,直到我想用参数调用方法,使用我的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"> &
<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>
通过服务引用在C#中使用SoapUI或测试客户端设置,它可以正常工作
唯一的问题是,login方法或任何其他具有参数的方法的参数在传递参数的节点中缺少名称空间前缀(nsl)。例如,当我在SOAPUi中手动添加它们时,它的工作方式就像魅力一样。有没有一种方法可以在不检查每个传入请求的情况下添加名称空间前缀
非常感谢 我有点不确定为什么必须提供Action属性,因为没有它,SOAP操作也可以工作。也许有线索 或者,如果您确实希望保留它并希望为每个请求添加名称空间,那么您可以探索XmlDocument类和XmlNode类。这里有一个简单的代码片段,可以在特定节点添加名称空间-
XmlDocument xdoc = new XmlDocument();
// Get Request Xml for each of the case
xdoc.LoadXml(xmlContent);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/");
nsmgr.AddNamespace("sc", "http://tempuri.org/");
我必须向服务的用户提供一个URN。我不知道为什么,但它只适用于动作属性。在我上面提到的SOAP消息中,如何获取用户名和userPasswordNode?类似于XmlDocument req=newxmldocument();//加载xml req.LoadXml(request.ToString());XmlNamespaceManager nsmgr=新的XmlNamespaceManager(req.NameTable);nsmgr.AddNamespace(“ns1”、“Estamfordecat”);XmlNode userName=req.SelectSingleNode(//soapenv:Envelope/s:Header/soapenv:Body/ns1:Login/a_sDMSUserName”,nsmgr);要访问子节点,需要执行以下操作-XmlNode node;//将Xml解析为XmlDoc node=xdoc.SelectSingleNode(“/soapenv:Envelope/soapenv:Body/ns1:login”,nsmgr);//这将为您提供一个“节点”,其中引用了子节点的用户名和密码。这将为您提供一个包含子节点的节点引用。使用for each循环-foreach(节点中的xmlnoden){if(n.Name==“a_sDMSUserName”){//Do something}如果对您有用,请标记为答案或投票。谢谢。谢谢,伙计。这很有帮助!!我现在可以更改元素的前缀,但它只更改名称,而不更改本地名称。例如,当我将xml打印到控制台时,没有添加前缀。不过还是要谢谢你!!
XmlDocument xdoc = new XmlDocument();
// Get Request Xml for each of the case
xdoc.LoadXml(xmlContent);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/");
nsmgr.AddNamespace("sc", "http://tempuri.org/");