2010-04-28 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Channels / HttpChannelListener.cs
index bb268417eacc146fe9316dd4206a59324d0972d1..9e015dd1ea6c004e1d995f74767dd35c4eff4ac6 100644 (file)
@@ -33,6 +33,7 @@ using System.Net;
 using System.Net.Security;
 using System.ServiceModel;
 using System.ServiceModel.Description;
+using System.ServiceModel.Dispatcher;
 using System.ServiceModel.Security;
 using System.Text;
 
@@ -66,7 +67,7 @@ namespace System.ServiceModel.Channels
 
                protected override HttpListenerManager CreateListenerManager ()
                {
-                       return new HttpSimpleListenerManager (this, Source, SecurityTokenManager);
+                       return new HttpSimpleListenerManager (this, Source, SecurityTokenManager, ChannelDispatcher);
                }
        }
 
@@ -79,10 +80,6 @@ namespace System.ServiceModel.Channels
                {
                }
 
-               internal SvcHttpHandler HttpHandler {
-                       get { return ((AspNetListenerManager) ListenerManager).Source; }
-               }
-
                protected override TChannel CreateChannel (TimeSpan timeout)
                {
                        if (typeof (TChannel) == typeof (IReplyChannel))
@@ -93,21 +90,31 @@ namespace System.ServiceModel.Channels
 
                protected override HttpListenerManager CreateListenerManager ()
                {
-                       return new AspNetListenerManager (this, Source, SecurityTokenManager);
+                       return new AspNetListenerManager (this, Source, SecurityTokenManager, ChannelDispatcher);
                }
        }
 
-       internal abstract class HttpChannelListenerBase<TChannel> : InternalChannelListenerBase<TChannel>
+       internal interface IChannelDispatcherBoundListener
+       {
+               ChannelDispatcher ChannelDispatcher { get; set; }
+       }
+
+       internal abstract class HttpChannelListenerBase<TChannel> : InternalChannelListenerBase<TChannel>, IChannelDispatcherBoundListener
                where TChannel : class, IChannel
        {
                List<TChannel> channels = new List<TChannel> ();
                MessageEncoder encoder;
                HttpListenerManager httpChannelManager;
 
+               internal static HttpChannelListenerBase<TChannel>CurrentHttpChannelListener;
+
                public HttpChannelListenerBase (HttpTransportBindingElement source,
                        BindingContext context)
                        : base (context)
                {
+                       if (ServiceHostBase.CurrentServiceHostHack != null)
+                               DispatcherBuilder.ChannelDispatcherSetter = delegate (ChannelDispatcher cd) { this.ChannelDispatcher = cd; };
+
                        this.Source = source;
                        // The null Uri check looks weird, but it seems the listener can be built without it.
                        // See HttpTransportBindingElementTest.BuildChannelListenerWithoutListenUri().
@@ -128,6 +135,8 @@ namespace System.ServiceModel.Channels
                                SecurityTokenManager = new ServiceCredentialsSecurityTokenManager ((ServiceCredentials) context.BindingParameters [typeof (ServiceCredentials)]);
                }
 
+               public ChannelDispatcher ChannelDispatcher { get; set; }
+
                public HttpTransportBindingElement Source { get; private set; }
 
                public HttpListenerManager ListenerManager {