Pergunta

Tenho um aplicativo corporativo interno que atualmente consome 10 serviços da Web diferentes.Eles são consumidos por meio de "Referências da Web" no estilo antigo, em vez de usar o WCF.

O problema que estou tendo é tentar trabalhar com as outras equipes da empresa que são autoras dos serviços que estou consumindo.Descobri que precisava capturar exatamente as mensagens SOAP que estou enviando e recebendo.Fiz isso criando um novo atributo que estende SoapExtensionAttribute.Em seguida, apenas adiciono esse atributo ao método de serviço no arquivo Reference.cs gerado.Isso funciona, mas é doloroso por dois motivos.Primeiro, é um arquivo gerado, então qualquer coisa que eu fizer nele pode ser substituída.Segundo, preciso lembrar de remover o atributo antes de fazer check-in do arquivo.

Existe uma maneira melhor de capturar exatamente as mensagens SOAP que estou enviando e recebendo?

Foi útil?

Solução

Esta parece ser uma pergunta comum, pois acabei de perguntar e me disseram para olhar aqui.

Você não precisa editar o gerado Reference.cs.Você pode fazer referência à extensão no arquivo do seu aplicativo app.config.

Outras dicas

Este é um aplicativo da web?

Coloque seu código SoapExtension em um HTTPModule e injete o envelope SOAP no fluxo HTTPOutput.

Dessa forma, quando estou no modo de depuração, imagino algo como um div recolhível no topo da página que lista toda a comunicação SOAP dessa página.

Já tenho um HTTPModule construído que faz isso, retirarei as informações específicas da minha empresa e postarei as novidades ainda hoje.

Além disso, dê uma olhada no SoapUI, é uma ferramenta útil.

Você pode fazer isso criando um SoapExtention.Verificar Este artigo.

Usei o código a seguir como um exemplo de como capturei solicitações SOAP em um aplicativo escrito há algum tempo.

<System.Diagnostics.Conditional("DEBUG")> _
    Private Sub CheckHTTPRequest(ByVal functionName As String)
        Dim e As New UTF8Encoding()

        Dim bytes As Long = Me.Context.Request.InputStream.Length
        Dim stream(bytes) As Byte
        Me.Context.Request.InputStream.Seek(0, IO.SeekOrigin.Begin)
        Me.Context.Request.InputStream.Read(stream, 0, CInt(bytes))

        Dim thishttpRequest As String = e.GetString(stream)

        My.Computer.FileSystem.WriteAllText("D:\SoapRequests\" & functionName & ".xml", thishttpRequest, False)

    End Sub

Definir o atributo condicional como fiz faz com que o compilador ignore a chamada do método para todos os tipos de compilação, exceto depuração.

Desculpe pelo VB, ele foi forçado a mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top