Удаление определенных элементов из заголовка - которые были созданы WSE 3.0

StackOverflow https://stackoverflow.com/questions/8311987

  •  25-10-2019
  •  | 
  •  

Вопрос

Я работаю с WSDL, который автоматически добавляет дополнительные элементы в XML. Для того, чтобы он соответствовал внешнему веб -службу, которая не использует эти элементы. Смотрите следующее изображение: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)

Любая помощь приветствуется.

Майкл

Это было полезно?

Решение 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:-

В веб -ссылке.

        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

Общественное переопределение функциональных процессов - перезаписывает процесс, и позволяет мне вручную редактировать конверт

Мне нужно было вручную удалить элементы, которые мне не нуждались, и вручную вставить элементы.

Другие советы

Вы могли бы написать Soapextension. Анкет Я делал это в прошлом, чтобы очистить нелегальных персонажей от мыла, но вы также можете использовать его для изменения вашего запроса. По сути, он будет перехватывать пакет мыла до его отправки, или когда вы его получите, но до .NET DESORIALIGE.

У Стефана Госснера есть старый пост в блоге, который объясняет Как построить сосудление. Анкет Вы бы поместили свой код в ProcessOutput метод

Недостаток в том, что вы анализируете сообщение SOAP как текст, но, конечно, можно загрузить его в XDocument или же XmlDocument Если это работает лучше. Но вы также передаете его текстом впоследствии.

Если вы используете WCF, то проверьте Перехватывать сообщения в клиенте WCF, как вам нужно внедрить IClientMessageInspector для перехвата мыла.

Надеюсь, это поможет вам немного в пути.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top