3

次のようなASP.NETWebサービスがあります。

[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 message)内にブレークポイントを設定すると、次のように表示されます。

<request xmlns="http://internalservice.net/messageprocessing">
  <task>....various xml</task> 
</request>

有線でパケットをキャプチャすると、SOAPツールキットによって送信されるXMLが.NETWSクライアントによって送信される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ツールキットを使用して.NETWebサービスを呼び出してからかなりの時間が経ちましたが、このようなものを回避するために引っ張っていた巧妙なトリック/SOAP-fuをすべて思い出せません。

何か案は?1つの解決策は、XMLを文字列パラメーターとして受け取り、私に代わってWSを呼び出すCOM呼び出し可能.NETプロキシをノックアップすることですが、これは私がやりたくない複雑さ/作業の余分な層です。

4

3 に答える 3

1

ケブ、

私は解決策を見つけましたが、それは簡単ではありません。

適切なヘッダーを作成する IHeaderHandler のカスタム実装を作成する必要があります。

ここにステップバイステップの良いステップがあります:

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

編集:あなたの更新を見ました。良い回避策です。関係なく、このリンクをブックマークすることをお勧めします:D

于 2008-08-21T04:54:42.633 に答える
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...
    }
}
于 2008-08-21T04:14:48.660 に答える
0

私はこれを解決しました:

SOAPクライアント要求ノードは、以下からデフォルトの名前空間を取得していました。

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

ASPクライアントによって送信されるXMLに空のデフォルトの名前空間を追加すると、次の動作がオーバーライドされます。

xmlMessage = "<request xmlns=''><task>....various xml</task></request>"
于 2008-08-21T04:18:45.200 に答える