Capturer SOAP Demandes de service Web ASP.NET ASMX

Considérez l'obligation d'enregistrer des demandes entrantes. SOAP au service Web ASP.NET ASMX. La tâche est de capturer raw XML, Départé dans le service Web.

Le message entrant doit être enregistré pour vérifier le débogage. L'application a déjà sa propre bibliothèque de journalisation. Ce serait donc une utilisation idéale de quelque chose comme ceci:


//string or XML, it doesn't matter.
string incomingSoapRequest = GetSoapRequest//;

Logger.LogMessage/incomingSoapRequest/;


Y a-t-il des solutions simples pour capturer XML entrant SOAP Demandes?

Quels événements auriez-vous traité pour accéder à cet objet et les propriétés correspondantes?

Est là quand même IIS Peut capturer une demande entrante et poussez-la dans un magazine?
Invité:

Emilie

Confirmation de:

Vous pouvez également le réaliser en plaçant le code dans Global.asax.cs


protected void Application_BeginRequest/object sender, EventArgs e/
{
// Create byte array to hold request bytes
byte[] inputStream = new byte[HttpContext.Current.Request.ContentLength];

// Read entire request inputstream
HttpContext.Current.Request.InputStream.Read/inputStream, 0, inputStream.Length/;

//Set stream back to beginning
HttpContext.Current.Request.InputStream.Position = 0;

//Get XML request
string requestString = ASCIIEncoding.ASCII.GetString/inputStream/;

}


J'ai une méthode de service dans mon service Web, que j'utilise pour capturer la demande lorsque quelque chose que je ne m'attends pas, par exemple une exception non transformée.


/// <summary>
/// Captures raw XML request and writes to FailedSubmission folder.
/// </summary>
internal static void CaptureRequest//
{
const string procName = "CaptureRequest";

try
{
log.WarnFormat/"{0} - Writing XML request to FailedSubmission folder", procName/;

byte[] inputStream = new byte[HttpContext.Current.Request.ContentLength];

//Get current stream position so we can set it back to that after logging
Int64 currentStreamPosition = HttpContext.Current.Request.InputStream.Position;

HttpContext.Current.Request.InputStream.Position = 0;

HttpContext.Current.Request.InputStream.Read/inputStream, 0, HttpContext.Current.Request.ContentLength/;

//Set back stream position to original position
HttpContext.Current.Request.InputStream.Position = currentStreamPosition;

string xml = ASCIIEncoding.ASCII.GetString/inputStream/;

string fileName = Guid.NewGuid//.ToString// + ".xml";

log.WarnFormat/"{0} - Request being written to filename: {1}", procName, fileName/;

File.WriteAllText/Configuration.FailedSubmissionsFolder + fileName, xml/;
}
catch
{
}

}


Puis B. web.config Je garde quelques valeurs AppSetting, Qui définissent quel niveau je veux utiliser pour capturer la demande.


 true/false - If true will write to an XML file the raw request when any Unhandled exception occurrs 
<add key="CaptureRequestOnUnhandledException" value="true"></add>
true/false - If true will write to an XML file the raw request when any type of error is returned to the client
<add key="CaptureRequestOnAllFailures" value="false"></add>
true/false - If true will write to an XML file the raw request for every request to the web service
<add key="CaptureAllRequests" value="false"></add>


Puis dans mon Application_BeginRequest Je l'ai changé comme suit. Veuillez noter que la configuration est une classe statique que je crée pour lire les propriétés de web.config et d'autres domaines.


protected void Application_BeginRequest/object sender, EventArgs e/
{

if/Configuration.CaptureAllRequests/
{
Utility.CaptureRequest//;
}
}

Emmanuel

Confirmation de:

Une façon de saisir le message non traité - utilisation
http://msdn.microsoft.com/en-u ... .aspx
.

Alternative SoapExtensions Est la mise en œuvre IHttpModule et capturer le flux d'entrée tel qu'il arrive.


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

Catherine

Confirmation de:

Vous savez que sur le très

affaires

Vous n'avez pas besoin de créer
HttpModule

, à droite?

Vous pouvez également lire le contenu.
Request.InputStream

des vôtres asmx
WebMethod

.

Ici
http://desalasworks.com/how-to ... ices/
.

Le code est comme suit:


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 = "[url=http://soap.request.echo.com/"]http://soap.request.echo.com/"[/url],
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 beginning 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;
}
}
}

Francois

Confirmation de:

Pas de façons simples de le faire. Vous devrez mettre en œuvre
http://msdn.microsoft.com/en-u ... .aspx
. Un exemple du lien précédent indique une extension pouvant être utilisée pour enregistrer des données.

Si vous avez utilisé WCF, Vous pouvez simplement configurer la configuration pour créer des journaux de messagerie.

Selon

, Vous pouvez utiliser la propriété.
Request.InputStream

dans une méthode Web. Je n'ai pas essayé, mais il dit que ça marche.

Je voudrais vérifier comme avec http, Ainsi et S. https, ainsi que d'autres SoapExtensions, Travailler en même temps, donc sans eux. Ce sont des choses qui peuvent affecter le thread est installé dans
InputStream

. Certains flux ne peuvent pas rechercher, par exemple, qui peuvent vous laisser avec un flux, situé après la fin des données et que vous ne pouvez pas passer au début.

Pour répondre aux questions, connectez-vous ou registre