2010-04-06 8 views

Respuesta

11

Una alternativa a SoapExtensions es implementar IHttpModule y agarrar el flujo de entrada, ya que está entrando.

public class LogModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += this.OnBegin; 
    } 

    private void OnBegin(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     HttpContext context = app.Context; 

     byte[] buffer = new byte[context.Request.InputStream.Length]; 
     context.Request.InputStream.Read(buffer, 0, buffer.Length); 
     context.Request.InputStream.Position = 0; 

     string soapMessage = Encoding.ASCII.GetString(buffer); 

     // Do something with soapMessage 
    } 

    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+2

quizá obvio, pero puede que tenga que registrar el IHttpModule en el web.config

1

Asumo que están queriendo registrar la solicitud SOAP para el rastreo; tal vez tengas un consumidor de tu servicio que te dice que te están enviando un buen SOAP, pero no les crees, ¿verdad?

En ese caso, debe (temporalmente) enable trace logging on your service.

Si está intentando hacer un registro de propósito general, no se moleste con el paquete SOAP, ya que es pesado; tus registros se hincharían rápido. Solo registre las cosas importantes, como p. "Agregar llamado, X = foo, Y = barra".

+1

Desafortunadamente tiene que ser permanente, por lo que no puedo habilitar el seguimiento solo temporalmente. –

+0

@bangoker: Aunque haya encontrado una solución que cubra su necesidad inmediata, le sugiero que reconsidere su curso. Registrar cada solicitud SOAP es pesado y extremadamente innecesario. – Randolpho

6

Sí, puede hacerlo utilizando SoapExtensions. Aquí hay un nice article que se ejecuta a través del proceso.

+0

Creo que eso es lo que estaba buscando, ¡gracias! –

+4

El enlace está roto. – wRAR

+0

desmarcado como la respuesta ya que el vínculo se rompe –

5

También puede leer el contents of the Request.InputStream.

De esta manera es más útil, como para los casos en los que desea realizar la validación u otras acciones dentro del WebMethod, dependiendo del contenido de la entrada.

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Xml; 
using System.IO; 
using System.Text; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

namespace SoapRequestEcho 
{ 
    [WebService(
    Namespace = "http://soap.request.echo.com/", 
    Name = "SoapRequestEcho")] 
    public class EchoWebService : WebService 
    { 

    [WebMethod(Description = "Echo Soap Request")] 
    public XmlDocument EchoSoapRequest(int input) 
    { 
     // Initialize soap request XML 
     XmlDocument xmlSoapRequest = new XmlDocument(); 

     // Get raw request body 
     Stream receiveStream = HttpContext.Current.Request.InputStream 

     // Move to begining of input stream and read 
     receiveStream.Position = 0; 
     using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8)) 
     { 
     // Load into XML document 
     xmlSoapRequest.Load(readStream); 
     } 

     // Return 
     return xmlSoapRequest; 
    } 
    } 
} 

NOTA: actualizado para reflejar comentario Johns a continuación.

+0

¿Has probado este código? Entre otras cosas, no creo que debas tener bloques 'using', ya que no estás creando' Stream'. El 'StreamReader' tampoco debería estar en un bloque' using', ya que su eliminación también cerrará la transmisión y la transmisión no le pertenece. También me pregunto si esto interoperará con cualquier 'SoapExtension' que luego pueda configurarse. –

+0

Sí, lo intenté y funcionó bien (intente hacer clic en el enlace), en cuanto al uso o no uso, es solo una opción del programador de cómo quiere estructurar su código. –

+1

@Steven: te equivocas con 'usar' en este caso. Si fuera 'using (var x = new StreamReader())', sería una elección: el 'StreamReader' te pertenece porque lo has creado. En este caso, el 'Stream' pertenece al objeto' Request', no lo creó, por lo que no debería llamar 'Dispose' en él - nunca. –

Cuestiones relacionadas