Pregunta

Tengo una aplicación empresarial interna que actualmente consume 10 servicios web diferentes.Se consumen a través de "Referencias web" de estilo antiguo en lugar de utilizar WCF.

El problema que tengo es intentar trabajar con los otros equipos de la empresa que crean los servicios que estoy consumiendo.Descubrí que necesitaba capturar los mensajes SOAP exactos que envío y recibo.Hice esto creando un nuevo atributo que extiende SoapExtensionAttribute.Luego simplemente agrego ese atributo al método de servicio en el archivo Reference.cs generado.Esto funciona, pero es doloroso por dos razones.Primero, es un archivo generado, por lo que todo lo que haga allí se puede sobrescribir.En segundo lugar, debo recordar eliminar el atributo antes de registrar el archivo.

¿Existe una mejor manera de capturar los mensajes SOAP exactos que envío y recibo?

¿Fue útil?

Solución

Esta parece ser una pregunta común, ya que la acabo de hacer y me dijeron que mirara aquí.

No es necesario editar el generado. Reference.cs.Puede hacer referencia a la extensión en el archivo de su aplicación. app.config.

Otros consejos

¿Es esta una aplicación web?

Coloque su código SoapExtension en un HTTPModule e inyecte el sobre SOAP en la secuencia HTTPOutput.

De esa manera, cuando estoy en modo de depuración, me imagino algo así como un div plegable en la parte superior de la página que enumera todas las comunicaciones SOAP para esa página.

Ya tengo un HTTPModule creado que hace esto. Eliminaré la información específica de mi empresa y publicaré las ventajas más tarde hoy.

Además, consulte SoapUI, es una herramienta útil.

Puedes hacer esto creando una SoapExtention.Controlar Este artículo.

Utilicé el siguiente código como ejemplo de cómo capturé solicitudes SOAP en una aplicación escrita hace un tiempo.

<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

Establecer el atributo condicional como lo hice yo hace que el compilador ignore la llamada al método para todos los tipos de compilación que no sean depuración.

Perdón por el VB, me lo imponen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top