2010-04-06 1 views

Répondre

11

Une alternative à SoapExtensions est de mettre en œuvre IHttpModule et saisir le flux d'entrée comme il arrive dans.

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

peut-être évident, mais vous devrez peut-être enregistrer le IHttpModule dans le web.config

1

Je suppose que vous êtes désireux de connecter la requête SOAP pour le traçage; vous avez peut-être un consommateur de votre service qui vous dit qu'il vous envoie un bon savon, mais vous ne le croyez pas, oui? Dans ce cas, vous devez (temporairement) enable trace logging on your service.

Si vous essayez d'effectuer une journalisation générale, ne vous embêtez pas avec le paquet SOAP, car il est lourd; vos bûches flamberaient rapidement. Il suffit de noter les éléments importants, comme par ex. "Ajouter appelé, X = foo, Y = bar".

+1

Malheureusement, il doit être permanent, donc je ne peux pas activer la trace juste temporairement. –

+0

@bangoker: Bien que vous ayez trouvé une solution qui répond à vos besoins immédiats, je vous suggère de reconsidérer votre cours. La journalisation de chaque requête SOAP est lourde et extrêmement inutile. – Randolpho

6

Oui, vous pouvez le faire en utilisant SoapExtensions. Voici un nice article qui traverse le processus.

+0

Je pense que c'est ce que je cherchais, merci! –

+4

Le lien est cassé. – wRAR

+0

démarquage réponse puisque le lien est rompu –

5

Vous pouvez également lire le contents of the Request.InputStream. De cette façon, il est plus utile, par exemple, lorsque vous souhaitez effectuer une validation ou d'autres actions dans WebMethod en fonction du contenu de l'entrée.

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

NOTE: Mise à jour pour refléter Johns commentaire ci-dessous.

+0

Avez-vous essayé ce code? Entre autres choses, je ne pense pas que vous devriez avoir des blocs 'using', puisque vous ne créez pas' Stream'. Le 'StreamReader' ne devrait pas non plus être dans un bloc' using', car le jeter ferme aussi le flux, et le flux ne vous appartient pas. Je me demande aussi si cela interfèrera avec tout 'SoapExtension' qui pourrait être configuré plus tard. –

+0

Oui, j'ai essayé et fonctionne bien (essayez de cliquer sur le lien), quant à l'utilisation ou non, c'est juste un choix du programmeur de la façon dont vous voulez structurer votre code. –

+1

@Steven: vous vous trompez sur 'using 'dans ce cas. Si c'était 'using (var x = new StreamReader())' alors ce serait un choix - le 'StreamReader' vous appartient parce que vous l'avez créé. Dans ce cas, le 'Stream 'appartient à l'objet' Request' - vous ne l'avez pas créé, vous ne devriez donc pas appeler' Dispose' - jamais. –

Questions connexes