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?
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.