Вызов веб-службы ASP.NET из ASP с помощью SoapClient


3

У меня есть веб-сервиса 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 немного отличается от посланного в .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 инструментарий для вызова в .NET веб-сервисов, я не могу вспомнить все умные трюки/SOAP-fu, которые я использовал, чтобы обойти такие вещи.

Любые идеи? Одним из решений является сбивание COM-вызываемого .NET-прокси, который принимает XML как строковый параметр и вызывает WS от моего имени, но это дополнительный уровень сложности/работы, который я надеялся не делать.

0

Я решил это:

Клиент SOAP запрос узел подбирал пространство имен по умолчанию из:

<ProcessMessage xmlns="http://internalservice.net/messageprocessing"> 

Добавления пустого пространства имен по умолчанию в XML, отправленный клиентом ASP переопределяет это поведение:

xmlMessage = "<request xmlns=''><task>....various xml</task></request>" 

0

Насколько я понял, у вас есть доступ к коду служб, а не только к потребителю?

Просто вытащите пространство имен из 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... 
    } 
} 

1

к,

Я нашел решение, но его не тривиален.

Вам необходимо создать пользовательскую реализацию IHeaderHandler, которая создает соответствующие заголовки.

Существует хороший шаг за шагом здесь:

http://msdn.microsoft.com/en-us/library/ms980699.aspx

EDIT: Я видел ваши обновления.Хорошее обходное решение, возможно, вы захотите пометить эту ссылку независимо: D

  0

Yep ... bookmarked ... :) +1 08 янв. 092009-01-08 14:36:32