私はの線に沿ってとASP.NETのWebサービスを持っているSOAPClient


3

を使用してASPから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クライアント。 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> 

それはあまりにも長い間、私は、.NET Webサービスを呼び出すためにASP/SOAPツールキットを使用するので、私は覚えていないことをされていますすべての賢いトリック/ SOAP-fu私はこのようなものを回避するために引っ張っていました。

アイデア? 1つの解決策は、XMLを文字列パラメータとして受け取り、私のためにWSを呼び出すCOM呼び出し可能な.NETプロキシをノックすることですが、これは余計な複雑さ/作業の余計なものです。

0

私はこれを解決:

SOAPクライアント要求ノードからデフォルトの名前空間を拾った:

<ProcessMessage xmlns="http://internalservice.net/messageprocessing"> 
ASPのクライアントから送信されたXMLに空のデフォルトの名前空間を追加する

は、この動作を無効にします:

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 1月. 092009-01-08 14:36:32