Exemple:
4 Réponses :
Je suppose que vous souhaitez enregistrer la demande de savon pour le traçage; Vous avez peut-être un consommateur de votre service qui vous dit qu'ils vous envoient un bon savon, mais vous ne les croyez pas, oui? p>
Dans ce cas, vous devriez (temporairement) Activer la journalisation des traces sur votre service. . p>
Si vous essayez de faire une journalisation générale des objectifs, ne vous embêtez pas avec le paquet de savon, car c'est lourd; Vos journaux bloquaient rapidement. Il suffit de connecter les choses importantes, comme par exemple. "Ajouter appelé, x = foo, y = bar". p>
Malheureusement, il doit être permanent, donc je ne peux pas activer la trace juste temporairement.
@Bangoker: Bien que vous ayez trouvé une solution qui remplit votre besoin immédiat, je vous suggère de reconsidérer votre cours. L'enregistrement de chaque demande de savon est lourde et extrêmement inutile.
Oui, vous pouvez le faire à l'aide de soapextensions. Voici un Nice Article qui traverse le processus. P>
Une alternative à SOAPExtensions consiste à implémenter IHTPPModule et à saisir le flux d'entrée au fur et à mesure de son arrivée.
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(); } }
Peut-être évident mais vous devrez peut-être enregistrer l'IHTPTPModule dans le web.config
Vous pouvez également lire le contenu de La requête.InputStream .
De cette façon, elle est plus utile, telle que pour les cas lorsque vous souhaitez effectuer une validation ou d'autres actions dans le WebMethod en fonction du contenu de l'entrée. P>
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; } } }
Avez-vous essayé ce code? Entre autres choses, je ne pense pas que vous devriez avoir en utilisant des blocs code>, car vous ne créez pas le flux
code>. Le
StreamReader Code> ne doit pas non plus être dans un bloc code> à l'aide du bloc CODE>, puisque l'élimination, il fermera également le flux et le flux ne vous appartient pas. Je me demande également de savoir si cela interopérera avec n'importe quel
SOAPExtension code> qui peut être configuré ultérieurement.
Oui, j'ai essayé et travaille bien (essayez de cliquer sur le lien), comme pour utiliser ou n'utiliser pas, son simple choix de programmeur de la manière dont vous souhaitez structurer votre code.
@Steven: Vous avez tort de en utilisant code> dans ce cas. S'il était
à l'aide de (var x = nouveau streamreader ()) code>, ce serait un choix - le
streamreader code> vous appartient car vous l'avez créée. Dans ce cas, le flux
code> appartient à l'objet de la demande code> code> - Vous ne l'avez pas créé, vous ne devez donc pas appeler
Disposer code> dessus - jamais .
@Steven: intéressant. J'aurais pensé que la désérialisation aurait déjà lu le flux à la fin. Ce n'est peut-être pas le flux d'origine, mais plutôt une nouvelle mémoire mémoire mémoire mémoire tamponnée de la demande. Il est bien connu que les services ASMX ont du mal avec de grandes demandes en raison du nombre de copies de la demande qui sont conservées en mémoire. C'est peut-être un flux sur l'une de ces copies. Sinon, je m'attendrais à ce que cela interfère avec des soapextensions, la sérialisation ou les filtres.
Bien sûr, vous êtes peut-être juste avec disposition de l'objet, mais à ce stade, il est peu probable que tout devra utiliser le flux.
@Steven: soin d'être constructif? Dis-vous qu'il est correct d'appeler d'appeler sur des objets qui "appartiennent à" un autre morceau de code ou dis-tu que cet objet "appartient" à votre code malgré le fait que vous l'obtenez d'une propriété d'un autre objet et don " t le créer vous-même?
@Steven: Les meilleures pratiques sont de ne pas dépendre de la mise en œuvre actuelle du code de quelqu'un d'autre (comme la structure .NET). Vous ne possédez pas ce code, alors ne sommes pas en mesure de savoir qui est ou n'est pas susceptible d'utiliser cet objet à nouveau. Entre autres choses, si c'était le flux réel utilisé pour lire à partir du réseau, toute soapextension ou httpmodule peut toujours vouloir y lire.
@Steven: Je viens de remarquer que vos "toutes httpModules ont tiré". mauvais b>. N'y a-t-il pas d'événements post-requêtes à tirer? Une soplexension ne sera-t-elle pas invoquée après i> la demande a été traitée?
@Steven: Merci pour la modification, mais j'apprécierais que si vous définissez un point d'arrêt avant la fin du en utilisant le bloc code>; Vérifiez si le flux code> code> est toujours ouvert, puis définissez-en une après la fin et vérifiez si le flux
code> est toujours ouvert. Je suis préoccupé par le
streamdreader.Dispose code> appelant
stream.dispose code>.