Search code examples
.netxmlsoapwse3.0

Removing certain Elements from Header - that were created by WSE 3.0


I am working with a wsdl which is automatically adding extra elements into the xml. In order for it to comply with an external web service that do not use these elements. See the following image: http://img406.imageshack.us/img406/1307/differencese.png Left = Red elements need removed - Right = What i need it to output

i have attached the code that is creating my envelope and payload.

    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)

Any help would be much appreciated.

Michael


Solution

  •     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)
    

    noticed i've removed the WSE coding:-

    within the web reference reference.vb i've added the following code in the pcublic sub new -

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

    and then

    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 Function ProcessMessage - overwrites the processmessage and lets me manually edit the envelope

    i needed to manually remove the elements i did not need and manually insert the elements Idid need: