9
votes

Y a-t-il un moyen d'obtenir la demande de savon brut de l'intérieur d'une webthod ASP.NET?

Exemple: xxx


0 commentaires

4 Réponses :


1
votes

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?

Dans ce cas, vous devriez (temporairement) Activer la journalisation des traces sur votre service. .

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".


2 commentaires

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.



6
votes

Oui, vous pouvez le faire à l'aide de soapextensions. Voici un Nice Article qui traverse le processus.


0 commentaires

11
votes

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


1 commentaires

Peut-être évident mais vous devrez peut-être enregistrer l'IHTPTPModule dans le web.config



7
votes

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


9 commentaires

Avez-vous essayé ce code? Entre autres choses, je ne pense pas que vous devriez avoir en utilisant des blocs , car vous ne créez pas le flux . Le StreamReader ne doit pas non plus être dans un bloc à l'aide du bloc , 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 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 dans ce cas. S'il était à l'aide de (var x = nouveau streamreader ()) , ce serait un choix - le streamreader vous appartient car vous l'avez créée. Dans ce cas, le flux appartient à l'objet de la demande - Vous ne l'avez pas créé, vous ne devez donc pas appeler Disposer 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 . N'y a-t-il pas d'événements post-requêtes à tirer? Une soplexension ne sera-t-elle pas invoquée après 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 ; Vérifiez si le flux est toujours ouvert, puis définissez-en une après la fin et vérifiez si le flux est toujours ouvert. Je suis préoccupé par le streamdreader.Dispose appelant stream.dispose .