【问题标题】:Removing certain Elements from Header - that were created by WSE 3.0从页眉中删除某些元素 - 由 WSE 3.0 创建
【发布时间】:2011-11-29 14:00:22
【问题描述】:

我正在使用一个 wsdl,它会自动将额外的元素添加到 xml 中。为了使其符合不使用这些元素的外部 Web 服务。见下图: http://img406.imageshack.us/img406/1307/differencese.png 左 = 需要移除红色元素 - 右 = 我需要它输出的内容

我附上了创建信封和有效负载的代码。

    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)

任何帮助将不胜感激。

迈克尔

【问题讨论】:

标签: .net xml soap wse3.0


【解决方案1】:

你可以写一个SoapExtension。我过去这样做是为了清除 SOAP 响应中的非法字符,但您也可以使用它来修改您的请求。基本上它会在 SOAP 包被发送之前,或者当你收到它,但在 .Net 反序列化它之前拦截它。

Stefan Goßner 有一篇旧博客文章解释了how build a SoapExtension。您可以将代码放入 ProcessOutput 方法中。

缺点是您将 SOAP 消息解析为文本,但如果效果更好,当然可以将其加载到 XDocumentXmlDocument 中。但是您之后也会将其作为文本传递。

如果您使用的是 WCF,请查看 Intercept messages in a WCF Client,因为您必须为 SOAP 拦截实现 IClientMessageInspector

希望这对您有所帮助。

【讨论】:

    【解决方案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)
    

    注意到我已经删除了 WSE 编码:-

    在 web 参考 reference.vb 中,我在 pcublic sub new 中添加了以下代码 -

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

    然后

    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 - 覆盖 processmessage 并让我手动编辑信封

    我需要手动删除我不需要的元素并手动插入 Idid 需要的元素:

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多