Question

Je travaille avec un wsdl qui ajoute automatiquement des éléments supplémentaires dans le fichier XML. Pour se conformer à un service Web externe qui ne pas utiliser ces éléments. Voir l'image suivante: http://img406.imageshack.us/img406/1307/differencese.png Gauche = éléments rouges ont besoin enlevés - = droite ce que je dois à la sortie

Je joins le code qui crée mon enveloppe et la charge utile.

    Dim content As myProxy.Content = New myProxy.Content
    Dim inputguid As String = Guid.NewGuid.ToString
    Dim service As myProxy.WebService = New myProxy.WebService
    Dim str As New System.Xml.XmlDocument
    Dim payload As myProxy.Payload = New myProxy.Payload

    'payload
    str.LoadXml(xmlstr)

    'manifest
    service.payloadManifest = New myProxy.PayloadManifest
    service.payloadManifest.manifest = New myProxy.Manifest() {New myProxy.Manifest}
    service.payloadManifest.manifest(0).element = "GetVehicleServiceHistory"
    service.payloadManifest.manifest(0).namespaceURI = ""
    service.payloadManifest.manifest(0).contentID = "Content0"
    service.payloadManifest.manifest(0).version = "2.01"
    service.SoapVersion = SoapProtocolVersion.Soap11

    service.UserAgent = "Jakarta Commons-HttpClient/3.1"
    Dim usertoken As New Microsoft.Web.Services3.Security.Tokens.UsernameToken("userid", "password", Microsoft.Web.Services3.Security.Tokens.PasswordOption.SendPlainText)

    service.RequestSoapContext.Security.Tokens.Add(usertoken)
    service.RequestSoapContext.Security.MustUnderstand = False

    payload.content = New myProxy.Content() {content}
    ReDim Preserve payload.content(0)
    payload.content(0).Any = str.DocumentElement
    payload.content(0).id = "Content0"

    service.Url = "http://localhost:8080"
    service.ProcessMessage(payload)

Toute aide serait très apprécié.

Michael

Était-ce utile?

La solution 2

    Dim content As blah.Content = New blah.Content
    Dim inputguid As String = Guid.NewGuid.ToString
    Dim service As blah.WebService = New blah.WebService
    Dim str As New System.Xml.XmlDocument
    Dim payload As blah.Payload = New blah.Payload

    'payload
    str.LoadXml(xmlstr)

    'manifest
    service.payloadManifest = New blah.PayloadManifest
    service.payloadManifest.manifest = New blah.Manifest() {New blah.Manifest}
    service.payloadManifest.manifest(0).element = "GetVehicleServiceHistory"
    service.payloadManifest.manifest(0).namespaceURI = ""
    service.payloadManifest.manifest(0).contentID = "Content0"
    service.payloadManifest.manifest(0).version = "2.01"
    service.SoapVersion = SoapProtocolVersion.Soap11

    service.UserAgent = "Jakarta Commons-HttpClient/3.1"


    payload.content = New blah.Content() {content}
    ReDim Preserve payload.content(0)
    payload.content(0).Any = str.DocumentElement
    payload.content(0).id = "Content0"

    service.ProcessMessage(payload)

a remarqué que j'ai supprimé le codage WSE: -

dans le Reference.vb de référence web j'ai ajouté le code suivant dans la sous nouvelle pcublic -

        Dim policy As New Policy()
        policy.Assertions.Add(New MyAssertion())
        Me.SetPolicy(policy)

et

Public Class MyPolicy
    Inherits SoapFilter
    Public Overrides Function ProcessMessage(ByVal envelope As SoapEnvelope) As SoapFilterResult
        'creating the <wsse:Security> element in the outgoing message
        Dim securityNode As XmlNode = envelope.CreateNode(XmlNodeType.Element, "wsse:Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")
        Dim securityAttr As XmlAttribute = envelope.CreateAttribute("soap:mustunderstand")
        securityAttr.Value = "1"
        'creating the <wsse:usernameToken> element
        Dim usernameTokenNode As XmlNode = envelope.CreateNode(XmlNodeType.Element, "wsse:UsernameToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")
        Dim userElement As XmlElement = usernameTokenNode
        userElement.SetAttribute("xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")


        'creating the <wsse:Username> element
        Dim userNameNode As XmlNode = envelope.CreateNode(XmlNodeType.Element, "wsse:Username", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")
        userNameNode.InnerXml = "username"


        'creating the <wsse:password> element
        Dim pwdNode As XmlNode = envelope.CreateNode(XmlNodeType.Element, "wsse:Password", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")
        Dim pwdElement As XmlElement = pwdNode
        pwdElement.SetAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText")
        pwdNode.InnerXml = "password"

        usernameTokenNode.AppendChild(userNameNode)
        usernameTokenNode.AppendChild(pwdNode)
        securityNode.AppendChild(usernameTokenNode)
        envelope.ImportNode(securityNode, True)
        Dim node As XmlNode = envelope.Header
        node.AppendChild(securityNode)


        Dim actionnode As XmlNode = envelope.Header("wsa:Action")
        envelope.Header.RemoveChild(actionnode)

        Dim messageNode As XmlNode = envelope.Header("wsa:MessageID")
        envelope.Header.RemoveChild(messageNode)

        Dim replyToNode As XmlNode = envelope.Header("wsa:ReplyTo")
        envelope.Header.RemoveChild(replyToNode)

        Dim toNode As XmlNode = envelope.Header("wsa:To")
        envelope.Header.RemoveChild(toNode)

        Return SoapFilterResult.[Continue]
    End Function
End Class

Public Class MyAssertion
    Inherits PolicyAssertion
    Public Overrides Function CreateClientInputFilter(ByVal context As FilterCreationContext) As SoapFilter
        Return Nothing
    End Function

    Public Overrides Function CreateClientOutputFilter(ByVal context As FilterCreationContext) As SoapFilter
        Return New MyPolicy()
    End Function

    Public Overrides Function CreateServiceInputFilter(ByVal context As FilterCreationContext) As SoapFilter
        Return Nothing
    End Function

    Public Overrides Function CreateServiceOutputFilter(ByVal context As FilterCreationContext) As SoapFilter
        Return Nothing
    End Function
End Class

Public Overrides Fonction de ProcessMessage - le ProcessMessage et écrase me permet de modifier manuellement l'enveloppe

i besoin de supprimer manuellement les éléments que je ne l'ai pas besoin et manuellement insérer les éléments Idid besoin:

Autres conseils

Vous pouvez écrire un SoapExtension . Je l'ai fait dans le passé pour nettoyer loin des caractères illégaux d'une réponse SOAP, mais vous pouvez l'utiliser pour modifier votre demande ainsi. Fondamentalement, il va intercepter le paquet SOAP avant qu'il ne soit envoyé, ou quand vous le recevez, mais avant .Net désérialise il.

Stefan Goßner a un vieux billet de blog qui explique comment construire un SoapExtension . Vous mettriez votre code dans la méthode ProcessOutput.

L'inconvénient est que vous analysez le message SOAP sous forme de texte, mais peut charger de cours vers le haut dans un XDocument ou XmlDocument si cela fonctionne mieux. Mais vous êtes aussi le transmettre sous forme de texte par la suite.

Si vous utilisez WCF, puis vérifier Intercept dans un client WCF , comme vous devez mettre en œuvre un IClientMessageInspector pour l'interception SOAP.

Espérons que cela vous aide un peu sur le chemin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top