Вызов ASP.NET веб-службы из ASP с помощью SoapClient
-
09-06-2019 - |
Вопрос
У меня есть веб-сервис ASP.NET, который работает следующим образом:
[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, используя что-то вроде:
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, веб-служба по пути добавила пространство имен по умолчанию.т. е.если я установлю точку останова внутри ProcessMessage(сообщение XmlDocument) Я увижу:
<request xmlns="http://internalservice.net/messageprocessing">
<task>....various xml</task>
</request>
Когда я перехватываю пакеты по проводам, я вижу, что XML, отправляемый SOAP toolkit, немного отличается от XML, отправляемого клиентом .NET WS.Инструментарий 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 toolkit для вызова .NET webservices, я не могу вспомнить все хитрые трюки / SOAP-fu, которые я использовал, чтобы обойти подобные вещи.
Есть какие-нибудь идеи?Одно из решений - запустить вызываемый .NET прокси, который принимает XML в качестве строкового параметра и вызывает WS от моего имени, но это дополнительный уровень сложности / работы, который я надеялся не выполнять.
Решение 3
Я решил эту проблему:
Клиент SOAP запрос узел получал пространство имен по умолчанию из:
<ProcessMessage xmlns="http://internalservice.net/messageprocessing">
Добавление пустого пространства имен по умолчанию к XML, отправляемому клиентом ASP, переопределяет это поведение:
xmlMessage = "<request xmlns=''><task>....various xml</task></request>"
Другие советы
Кев,
Я нашел решение, но оно не тривиально.
Вам нужно создать пользовательскую реализацию 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...
}
}