Jeg har en webservice hvor der bliver foretaget nogle soap kald. Jeg ville gerne logge disse kald i sql, så jeg kan se hvad i vores kunders soap kald der er forkert og nogle gange får soap kaldene til at fejle.
Men jeg kan ikke helt lure, hvordan jeg kan få fat på hele soap envelopen ovre i webservicen, da det jo som sådan er den jeg vil have fat i - og også logge.
Hmm, så man bliver ligefrem nød til at lave en streamreader for at læse httpstreamen, og så hive tingene ud derfra?
Jeg regnede faktisk med at man kunne læse SOAP-kaldet relativt let, på en eller anden måde. Evt et SOAP objekt, hvori alle informationer lå, som FX den XML som SOAP'en indeholder.
public class RequestLogger : Stream { private Stream real; private StreamWriter log; public RequestLogger(Stream real, StreamWriter log) { this.real = real; this.log = log; } public override bool CanRead { get { return true; } } public override bool CanSeek { get { return false; } } public override bool CanWrite { get { return false; } } public override long Length { get { return real.Length; } } public override long Position { get { return real.Position; } set { throw new NotSupportedException(); } } public override int Read(byte[] buffer, int offset, int count) { int n = real.Read(buffer, offset, count); log.Write(Encoding.UTF8.GetString(buffer, offset, n)); log.Flush(); return n; } public override long Seek(long offset, SeekOrigin direction) { throw new NotSupportedException(); } public override void SetLength(long length) { throw new NotSupportedException(); } public override void Close() { real.Close(); } public override void Flush() { real.Flush(); } public override void Write(byte[] buffer, int offset, int count) { throw new NotSupportedException(); } }
public override int Read(byte[] buffer, int offset, int count) { int n = real.Read(buffer, offset, count); log.Write(Encoding.UTF8.GetString(buffer, offset, n)); log.Flush(); return n; }
som skrive al SOAP XML ud.
(jeg ved ikke engang om du vil have HTTP headerne, men jeg synes at de hoerte med)
Dette kalder jeg fra en win-app som bare kalder metoden, og skriver resultatet ud til en label. Den skriver 'ok' og danner filen z.txt, men der står som sagt intet i den.
du kan teste paa req.Url og kun saette filter hvis det er den rigtige
raekkefoelgen er: containeren laeser XML request kalder den rigtige web service med de rigtige parametre udfra XML request og derfor er det fo sent at filtere naar man er i web servicen
Ah ok. Jeg prøvede også at se om man evt. kunne læse det fra Request.InputStream, men der var heller ingen gevinst. Jeg må prøve at smide det ind som et httpModul og filtrere imorgen så.
Ok, så fik jeg det prøvet af. Jeg lavede to nye classes (RequestLogger og RequestLoggerModule), lagde din kode ind, og skrev modulet ind i web.config, men....
Den nægter at compile med følgende info: Method 'Webservices.RequestLoggerModule.OnBeginRequest(object, System.EventArgs)' referenced without parentheses Method 'Webservices.RequestLoggerModule.OnEndRequest(object, System.EventArgs)' referenced without parentheses
Dette henviser til disse linier: app.BeginRequest += OnBeginRequest; app.EndRequest += OnEndRequest;
Projektet kører 1.1, hvilket måske kan være en årsag?
Hehe, ja jeg lurede på om det var grunden. Vi har endnu ikke opgraderet til 2.0, og vi regner med at springe den over og smutte direkte til 3.5. Jeg savner dog et par ting i 2.0, og nu savner jeg så også dette =)
Ok, nu vil den compile, men åbner jeg asmx filen får jeg følgende:
Parser Error Message: Could not load type RequestLoggerModule from assembly System.Web, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a.
RequestLogger og RequestLoggerModule ligger begge i rodbiblioteket, og følgende ligger i system.web i web.config: <httpModules> <add name="RequestLoggerModule" type="RequestLoggerModule" /> </httpModules>
Hvis jeg prøver at lave et SOAP kalde via min win-app, får jeg følgende fejl: System.InvalidOperationException: Client found response content type of 'text/html; charset=utf-8', but expected 'text/xml'.
Så det er jo underligt nok to forskellige fejl tilsyneladende.
Hmm, ok, så jeg skal compiler requestlogger og requestloggermodule i et andet projekt, og smide deres dll'er i bin som en reference. Ok, det prøver jeg så.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.