using System.Net.Security;
using System.ServiceModel;
using System.ServiceModel.Description;
+using System.ServiceModel.Dispatcher;
using System.ServiceModel.Security;
using System.Text;
protected override HttpListenerManager CreateListenerManager ()
{
- return new HttpSimpleListenerManager (this, Source, SecurityTokenManager, Host);
+ return new HttpSimpleListenerManager (this, Source, SecurityTokenManager, ChannelDispatcher);
}
}
protected override HttpListenerManager CreateListenerManager ()
{
- return new AspNetListenerManager (this, Source, SecurityTokenManager, Host);
+ return new AspNetListenerManager (this, Source, SecurityTokenManager, ChannelDispatcher);
}
}
MessageEncoder encoder;
HttpListenerManager httpChannelManager;
+ internal static HttpChannelListenerBase<TChannel>CurrentHttpChannelListener;
+
public HttpChannelListenerBase (HttpTransportBindingElement source,
BindingContext context)
: base (context)
{
- Host = ServiceHostBase.CurrentServiceHostHack;
+ 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.
SecurityTokenManager = new ServiceCredentialsSecurityTokenManager ((ServiceCredentials) context.BindingParameters [typeof (ServiceCredentials)]);
}
- public ServiceHostBase Host { get; private set; }
+ internal ChannelDispatcher ChannelDispatcher { get; set; }
public HttpTransportBindingElement Source { get; private set; }
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;
using System.ServiceModel.Description;
+using System.ServiceModel.Dispatcher;
using System.ServiceModel.Security;
using System.Security.Principal;
using System.Text;
Dictionary<Uri, HttpListener> opened_listeners;
HttpListener http_listener;
- public HttpSimpleListenerManager (IChannelListener channelListener, HttpTransportBindingElement source, ServiceCredentialsSecurityTokenManager securityTokenManager, ServiceHostBase host)
- : base (channelListener, source, securityTokenManager, host)
+ public HttpSimpleListenerManager (IChannelListener channelListener, HttpTransportBindingElement source, ServiceCredentialsSecurityTokenManager securityTokenManager, ChannelDispatcher dispatcher)
+ : base (channelListener, source, securityTokenManager, dispatcher)
{
- object key = host ?? new object (); // so that HttpChannelListener without ServiceHost is always assigned a new table.
+ object key = dispatcher != null ? dispatcher.Host : new object (); // so that HttpChannelListener without ServiceHost is always assigned a new table.
if (!http_listeners_table.TryGetValue (key, out opened_listeners)) {
opened_listeners = new Dictionary<Uri, HttpListener> ();
http_listeners_table [key] = opened_listeners;
{
SvcHttpHandler http_handler;
- public AspNetListenerManager (IChannelListener channelListener, HttpTransportBindingElement source, ServiceCredentialsSecurityTokenManager securityTokenManager, ServiceHostBase host)
- : base (channelListener, source, securityTokenManager, host)
+ public AspNetListenerManager (IChannelListener channelListener, HttpTransportBindingElement source, ServiceCredentialsSecurityTokenManager securityTokenManager, ChannelDispatcher dispatcher)
+ : base (channelListener, source, securityTokenManager, dispatcher)
{
http_handler = SvcHttpHandler.Current;
}
public MetadataPublishingInfo MexInfo { get { return mex_info; } }
public HttpTransportBindingElement Source { get; private set; }
- public ServiceHostBase Host { get; private set; }
+ public ChannelDispatcher Dispatcher { get; private set; }
SecurityTokenAuthenticator security_token_authenticator;
SecurityTokenResolver security_token_resolver;
registered_channels = new Dictionary<Uri, List<IChannelListener>> ();
}
- protected HttpListenerManager (IChannelListener channelListener, HttpTransportBindingElement source, ServiceCredentialsSecurityTokenManager securityTokenManager, ServiceHostBase host)
+ protected HttpListenerManager (IChannelListener channelListener, HttpTransportBindingElement source, ServiceCredentialsSecurityTokenManager securityTokenManager, ChannelDispatcher dispatcher)
{
- this.Host = host;
+ this.Dispatcher = dispatcher;
this.channel_listener = channelListener;
// FIXME: this cast should not be required, but current JIT somehow causes an internal error.
mex_info = ((IChannelListener) channelListener).GetProperty<MetadataPublishingInfo> ();
List<ChannelDispatcher> built_dispatchers = new List<ChannelDispatcher> ();
Dictionary<ServiceEndpoint, EndpointDispatcher> ep_to_dispatcher_ep = new Dictionary<ServiceEndpoint, EndpointDispatcher> ();
-
+
+ internal static Action<ChannelDispatcher> ChannelDispatcherSetter;
+
internal ChannelDispatcher BuildChannelDispatcher (Type serviceType, ServiceEndpoint se, BindingParameterCollection commonParams)
{
//Let all behaviors add their binding parameters
lock (HttpTransportBindingElement.ListenerBuildLock) {
ServiceHostBase.CurrentServiceHostHack = host;
IChannelListener lf = BuildListener (se, commonParams);
- ServiceHostBase.CurrentServiceHostHack = null;
cd = new ChannelDispatcher (lf, se.Binding.Name);
+ if (ChannelDispatcherSetter != null) {
+ ChannelDispatcherSetter (cd);
+ ChannelDispatcherSetter = null;
+ }
+ ServiceHostBase.CurrentServiceHostHack = null;
}
ep = cd.InitializeServiceEndpoint (serviceType, se);
built_dispatchers.Add (cd);