[英]Calling ASP.NET web service from ASP using SOAPClient
我有一个ASP.NET Web服务,其中包括:
[WebService(Namespace = "http://internalservice.net/messageprocessing")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class ProvisioningService : WebService
{
[WebMethod]
public XmlDocument ProcessMessage(XmlDocument message)
{
// ... do stuff
}
}
我使用以下内容从ASP调用Web服务:
provWSDL = "http://servername:12011/MessageProcessor.asmx?wsdl"
Set service = CreateObject("MSSOAP.SoapClient30")
service.ClientProperty("ServerHTTPRequest") = True
Call service.MSSoapInit(provWSDL)
xmlMessage = "<request><task>....various xml</task></request>"
result = service.ProcessMessage(xmlMessage)
我遇到的问题是,当XML到达ProcessMessage方法时,Web服务管道已经添加了一个默认命名空间。 即如果我在ProcessMessage(XmlDocument消息)中设置断点,我看到:
<request xmlns="http://internalservice.net/messageprocessing">
<task>....various xml</task>
</request>
当我在线上捕获数据包时,我可以看到SOAP工具包发送的XML与.NET WS客户端发送的XML略有不同。 SOAP工具包发送:
<SOAP-ENV:Envelope
xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"
xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ProcessMessage xmlns="http://internalservice.net/messageprocessing">
<message xmlns:SOAPSDK4="http://internalservice.net/messageprocessing">
<request>
<task>...stuff to do</task>
</request>
</message>
</ProcessMessage>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
虽然.NET客户端发送:
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ProcessMessage xmlns="http://internalservice.net/messageprocessing">
<message>
<request xmlns="">
<task>...stuff to do</task>
</request>
</message>
</ProcessMessage>
</soap:Body>
</soap:Envelope>
自从我使用ASP / SOAP工具包调用.NET webservices以来已经很久了,我不记得曾经用来解决这些问题的所有聪明的技巧/ SOAP-fu。
有任何想法吗? 一种解决方案是敲响一个COM可调用.NET代理,它将XML作为字符串参数并代表我调用WS,但这是我希望不做的额外复杂/工作层。
千电子伏,
我找到了解决方案,但它并非无足轻重。
您需要创建IHeaderHandler的自定义实现,以创建正确的标头。
这里有一个很好的步骤:
http://msdn.microsoft.com/en-us/library/ms980699.aspx
编辑:我看到了你的更新。 很好的解决方法,您可能想要将此链接添加为书签,无论如何:D
我认为你可以访问服务代码,而不仅仅是消费客户端吗?
只需将命名空间从XmlDocument中拉出来作为方法的第一部分。
就像是:
XmlDocument changeDocumentNamespace(XmlDocument doc, string newNamespace)
{
if (doc.DocumentElement.NamespaceURI.Length > 0)
{
doc.DocumentElement.SetAttribute("xmlns", newNameSpace);
XmlDocument newDoc = new XmlDocument();
newDoc.LoadXml(doc.OuterXml);
return newDoc;
}
else
{
return doc;
}
}
然后:
[WebService(Namespace = "http://internalservice.net/messageprocessing")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class ProvisioningService : WebService
{
[WebMethod]
public XmlDocument ProcessMessage(XmlDocument message)
{
message = changeDocumentNamespace(message,String.Empty);
// Do Stuff...
}
}
我解决了这个问题
SOAP客户端请求节点从以下位置获取默认命名空间:
<ProcessMessage xmlns="http://internalservice.net/messageprocessing">
将空的默认命名空间添加到ASP客户端发送的XML会覆盖此行为:
xmlMessage = "<request xmlns=''><task>....various xml</task></request>"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.