// // Class: SOAPLoggerExtension // Current CLR: 4.0.30319.34209 // System: Microsoft Visual Studio 10.0 // Author: dani // Created: 6/4/2015 7:49:28 AM // // Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved. using System; using System.Collections.Generic; using System.IO; using System.Web.Services.Protocols; using log4net; namespace bsmd.database { /// /// Hilfsklasse um die eigentlichen SOAP-Inhalte mitzulesen /// http://stackoverflow.com/questions/300674/getting-raw-soap-data-from-a-web-reference-client-running-in-asp-net /// und /// http://www.rhyous.com/2015/04/29/authenticating-to-java-web-services-with-csharp-using-soap-authentication/ /// public class SOAPLoggerExtension : SoapExtension { private static readonly ILog _log = LogManager.GetLogger(typeof(SOAPLoggerExtension)); private Stream oldStream; private Stream newStream; public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) { return null; } public override object GetInitializer(Type serviceType) { return null; } public override void Initialize(object initializer) { } public override System.IO.Stream ChainStream(System.IO.Stream stream) { oldStream = stream; newStream = new MemoryStream(); return newStream; } public override void ProcessMessage(SoapMessage message) { switch (message.Stage) { case SoapMessageStage.BeforeSerialize: _log.Debug("BeforeSerialize"); break; case SoapMessageStage.AfterSerialize: this.Log(message, "AfterSerialize"); CopyStream(newStream, oldStream); newStream.Position = 0; break; case SoapMessageStage.BeforeDeserialize: CopyStream(oldStream, newStream); this.Log(message, "BeforeDeserialize"); break; case SoapMessageStage.AfterDeserialize: _log.Debug("AfterDeserialize"); break; } } public void Log(SoapMessage message, string stage) { newStream.Position = 0; string contents = (message is SoapServerMessage) ? "SoapRequest " : "SoapResponse "; contents += stage + ";"; StreamReader reader = new StreamReader(newStream); contents += reader.ReadToEnd(); newStream.Position = 0; _log.Debug(contents); } void ReturnStream() { CopyAndReverse(newStream, oldStream); } void ReceiveStream() { CopyAndReverse(newStream, oldStream); } public void ReverseIncomingStream() { ReverseStream(newStream); } public void ReverseOutgoingStream() { ReverseStream(newStream); } public void ReverseStream(Stream stream) { TextReader tr = new StreamReader(stream); string str = tr.ReadToEnd(); char[] data = str.ToCharArray(); Array.Reverse(data); string strReversed = new string(data); TextWriter tw = new StreamWriter(stream); stream.Position = 0; tw.Write(strReversed); tw.Flush(); } void CopyAndReverse(Stream from, Stream to) { TextReader tr = new StreamReader(from); TextWriter tw = new StreamWriter(to); string str = tr.ReadToEnd(); char[] data = str.ToCharArray(); Array.Reverse(data); string strReversed = new string(data); tw.Write(strReversed); tw.Flush(); } private void CopyStream(Stream fromStream, Stream toStream) { try { StreamReader sr = new StreamReader(fromStream); StreamWriter sw = new StreamWriter(toStream); sw.WriteLine(sr.ReadToEnd()); sw.Flush(); } catch (Exception ex) { string message = String.Format("CopyStream failed because: {0}", ex.Message); _log.Error(message, ex); } } } #region class SoapLoggerExtensionAttribute [AttributeUsage(AttributeTargets.Method)] public class SoapLoggerExtensionAttribute : SoapExtensionAttribute { private int priority = 1; public override int Priority { get { return priority; } set { priority = value; } } public override System.Type ExtensionType { get { return typeof(bsmd.database.SOAPLoggerExtension); } } } #endregion }