Log HTTP reply Message too. Make logging customizible on under the moon.
authorAtsushi Eno <atsushi@ximian.com>
Fri, 22 Apr 2011 17:05:35 +0000 (02:05 +0900)
committerAtsushi Eno <atsushi@ximian.com>
Fri, 22 Apr 2011 17:05:35 +0000 (02:05 +0900)
Logging is done only when requested by MOON_WCF_TRACE=[stdout|stderr]
environment variable.

mcs/class/System.ServiceModel/System.ServiceModel.Channels.Http/HttpReplyChannel.cs
mcs/class/System.ServiceModel/System.ServiceModel.Channels.Http/HttpRequestContext.cs
mcs/class/System.ServiceModel/System.ServiceModel/Logger.cs

index a42c726b2246318c0e4d2953324e71cb96e50c21..aded4c6b8f748fd29ca1c3e23a9cd30d50961b01 100644 (file)
@@ -57,6 +57,10 @@ namespace System.ServiceModel.Channels.Http
                        }
                }
 
+               internal HttpChannelListener<IReplyChannel> Source {
+                       get { return source; }
+               }
+
                public MessageEncoder Encoder {
                        get { return source.MessageEncoder; }
                }
@@ -176,7 +180,7 @@ namespace System.ServiceModel.Channels.Http
                        msg.Properties.Add ("Via", LocalAddress.Uri);
                        msg.Properties.Add (HttpRequestMessageProperty.Name, CreateRequestProperty (ctxi));
 
-                       Logger.LogMessage (MessageLogSourceKind.TransportReceive, ref msg, 0x10000); // FIXME: pass maxMessageSize.
+                       Logger.LogMessage (MessageLogSourceKind.TransportReceive, ref msg, source.Source.MaxReceivedMessageSize);
 
                        context = new HttpRequestContext (this, ctxi, msg);
                        reqctx = context;
index 9ad09377001915a9bb0d9444c15bfae1bb147b63..fbdf75f8df803ba5951a8a2f468491d3343e5694 100644 (file)
@@ -133,6 +133,8 @@ namespace System.ServiceModel.Channels.Http
                        if (msg == null)
                                throw new ArgumentNullException ("msg");
 
+                       Logger.LogMessage (MessageLogSourceKind.TransportSend, ref msg, Channel.Source.Source.MaxReceivedMessageSize);
+
                        MemoryStream ms = new MemoryStream ();
                        Channel.Encoder.WriteMessage (msg, ms);
                        Context.Response.ContentType = Channel.Encoder.ContentType;
index 81241084442510aea92e9e3e2545097149312318..832cbf7f74b5625bbd0c8b1f9075fb671719b0b5 100644 (file)
@@ -66,15 +66,29 @@ namespace System.ServiceModel
                const string xmlns = "http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace";
                static MessageLoggingSettings settings = new MessageLoggingSettings ();
                static int event_id;
-#if !NET_2_1
+#if NET_2_1
+               static TextWriter log_writer = TextWriter.Null;
+#else
                static readonly TraceSource source = new TraceSource ("System.ServiceModel");
                static readonly TraceSource message_source = new TraceSource ("System.ServiceModel.MessageLogging");
+#endif
 
                static Logger ()
                {
+#if NET_2_1
+                       // this will work only on moonlight though...
+                       switch (Environment.GetEnvironmentVariable ("MOON_WCF_TRACE")) {
+                       case "stdout":
+                               log_writer = Console.Out;
+                               break;
+                       case "stderr":
+                               log_writer = Console.Error;
+                               break;
+                       }
+#else
                        message_source.Switch.Level = SourceLevels.Information;
-               }
 #endif
+               }
 
                #region logger methods
 
@@ -108,8 +122,8 @@ namespace System.ServiceModel
                static void Log (TraceEventType eventType, string message, params object [] args)
                {
 #if NET_2_1
-                       Console.Error.Write ("[{0}]", event_id++);
-                       Console.Error.WriteLine (message, args);
+                       log_writer.Write ("[{0}]", event_id++);
+                       log_writer.WriteLine (message, args);
 #else
                        source.TraceEvent (eventType, event_id++, message, args);
 #endif
@@ -121,9 +135,11 @@ namespace System.ServiceModel
                
                static readonly XmlWriterSettings xws = new XmlWriterSettings () { OmitXmlDeclaration = true };
                
-               public static void LogMessage (MessageLogSourceKind sourceKind, ref Message msg, int maxMessageSize)
+               public static void LogMessage (MessageLogSourceKind sourceKind, ref Message msg, long maxMessageSize)
                {
-                       var mb = msg.CreateBufferedCopy (maxMessageSize);
+                       if (maxMessageSize > int.MaxValue)
+                               throw new ArgumentOutOfRangeException ("maxMessageSize");
+                       var mb = msg.CreateBufferedCopy ((int) maxMessageSize);
                        msg = mb.CreateMessage ();
                        LogMessage (new MessageLogTraceRecord (sourceKind, msg.GetType (), mb));
                }
@@ -147,8 +163,8 @@ namespace System.ServiceModel
                        xw.WriteEndElement ();
                        xw.Close ();
 #if NET_2_1
-                       Console.Error.Write ("[{0}]", event_id++);
-                       Console.Error.WriteLine (sw);
+                       log_writer.Write ("[{0}]", event_id++);
+                       log_writer.WriteLine (sw);
 #else
                        message_source.TraceData (TraceEventType.Information, event_id++, doc.CreateNavigator ());
 #endif