2010-04-06 4 views

Antwort

11

Eine Alternative zu SoapExtensions ist IHttpModule zu implementieren und den Eingangsstrom greifen, wie es in.

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

vielleicht offensichtlich, aber Sie können die IHttpModule in der web.config registrieren müssen

1

Ich nehme an, Sie wollen die SOAP-Anforderung für die Ablaufverfolgung zu protokollieren; Vielleicht haben Sie einen Verbraucher Ihrer Dienstleistung, der Ihnen sagt, dass er Ihnen eine gute Seife schickt, aber Sie glauben ihnen nicht, ja?

In diesem Fall sollten Sie (vorübergehend) enable trace logging on your service.

Wenn Sie Mehrzweckprotokollierung zu tun versuchen, nicht die Mühe mit dem SOAP-Paket, da es schwer ist; Ihre Protokolle würden sich schnell aufblähen. Protokollieren Sie einfach die wichtigen Dinge, wie z. "Add genannt, X = foo, Y = Balken".

+1

Leider muss es permanent sein, also kann ich die Spur nicht nur vorübergehend aktivieren. –

+0

@bangoker: Obwohl Sie eine Lösung gefunden haben, die Ihren unmittelbaren Bedarf erfüllt, schlage ich vor, dass Sie Ihren Kurs überdenken. Das Protokollieren jeder SOAP-Anfrage ist schwer und extrem unnötig. – Randolpho

6

Ja, Sie können es mit SoapExtensions tun. Hier ist ein nice article, der den Prozess durchläuft.

+0

Ich denke, das ist, was ich gesucht habe, danke! –

+4

Die Verbindung ist unterbrochen. – wRAR

+0

Abwählen als Antwort, da die Verbindung unterbrochen wird –

5

kommen wird auch die contents of the Request.InputStream lesen Sie können.

Auf diese Weise seine nützlicher wie für Fälle, in denen Sie die Validierung oder andere Aktionen in der WebMethod abhängig vom Inhalt des Eingangs ausführen möchten.

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; 
    } 
    } 
} 

HINWEIS: Aktualisiert unter Johns Kommentar zu reflektieren.

+0

Haben Sie diesen Code versucht? Unter anderem glaube ich nicht, dass du 'using'-Blöcke haben solltest, da du nicht den' Stream' erstellst. Der 'StreamReader' sollte sich auch nicht in einem' using' Block befinden, da durch das Entsorgen auch der Stream geschlossen wird und der Stream nicht zu dir gehört. Ich frage auch, ob dies mit irgendeiner "SoapExtension" interagiert, die später konfiguriert wird. –

+0

Ja, ich habe versucht und funktioniert gut (versuchen Sie auf den Link), wie für die Verwendung oder nicht, es ist nur ein Programmierer Wahl, wie Sie Ihren Code strukturieren möchten. –

+1

@Steven: Sie irren sich in diesem Fall über 'using'. Wenn es 'using (var x = new StreamReader())' wäre, dann wäre es eine Wahl - der 'StreamReader' gehört Ihnen, weil Sie ihn erstellt haben. In diesem Fall gehört der 'Stream' zum' Request' Objekt - Sie haben ihn nicht erstellt, also sollten Sie nicht 'Dispose' darauf aufrufen. –