Skip to content

Commit

Permalink
Removed AspNetHost and HubModule and used Routes instead.
Browse files Browse the repository at this point in the history
- Added Global class that stores "the" default static dependency resolver if none specified.
- Replaced HubModule with a single named route "signalr.hubs".
  • Loading branch information
davidfowl committed Mar 21, 2012
1 parent 349eb0b commit d539211
Show file tree
Hide file tree
Showing 18 changed files with 213 additions and 122 deletions.
10 changes: 4 additions & 6 deletions SignalR.Hosting.AspNet.Samples/App_Start/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,11 @@ namespace SignalR.Samples.App_Start
public class Startup
{
public static void Start()
{
{
ThreadPool.QueueUserWorkItem(_ =>
{
var connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
var connection = connectionManager.GetConnection<Streaming.Streaming>();
var demoClients = connectionManager.GetClients<DemoHub>();
var connection = Global.Connections.GetConnection<Streaming.Streaming>();
var demoClients = Global.Connections.GetClients<DemoHub>();
while (true)
{
Expand All @@ -37,7 +35,7 @@ public static void Start()
Thread.Sleep(2000);
}
});

RouteTable.Routes.MapConnection<Raw.Raw>("raw", "raw/{*operation}");
RouteTable.Routes.MapConnection<Streaming.Streaming>("streaming", "streaming/{*operation}");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,10 @@
<Project>{0E513AE2-BEA8-40CF-B9F2-102B351F2FB2}</Project>
<Name>SignalR.Hosting.AspNet</Name>
</ProjectReference>
<ProjectReference Include="..\SignalR.Hosting.Common\SignalR.Hosting.Common.csproj">
<Project>{3B71F0AE-D4B6-4F47-BF62-333D45615673}</Project>
<Name>SignalR.Hosting.Common</Name>
</ProjectReference>
<ProjectReference Include="..\SignalR\SignalR.csproj">
<Project>{1B9A82C4-BCA1-4834-A33E-226F17BE070B}</Project>
<Name>SignalR</Name>
Expand Down
36 changes: 5 additions & 31 deletions SignalR.Hosting.AspNet/AspNetBootstrapper.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using System;
using System.Web;
using System.Web;
using System.Web.Routing;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using SignalR.Hosting.AspNet;
using SignalR.Hubs;
using SignalR.Hosting.AspNet.Routing;

[assembly: PreApplicationStartMethod(typeof(AspNetBootstrapper), "Initialize")]

Expand All @@ -16,51 +16,25 @@ public static class AspNetBootstrapper

public static void Initialize()
{
// Register the hub module
RegisterHubModule();
}

internal static void InitializeHubDependencies()
{
// Ensure this is only called once
if (!_initialized)
{
lock (_lockObject)
{
if (!_initialized)
{
// Initializes the hub depedencies once

var hubLocator = new Lazy<BuildManagerTypeLocator>(() => new BuildManagerTypeLocator());
var typeResolver = new Lazy<BuildManagerTypeResolver>(() => new BuildManagerTypeResolver(hubLocator.Value));

AspNetHost.DependencyResolver.Register(typeof(IHubLocator), () => hubLocator.Value);
AspNetHost.DependencyResolver.Register(typeof(IHubTypeResolver), () => typeResolver.Value);
RouteTable.Routes.MapHubs("signalr.hubs", "~/signalr");

_initialized = true;
}
}
}
}

private static void RegisterHubModule()
{
try
{
DynamicModuleUtility.RegisterModule(typeof(HubModule));
}
catch
{
// If we're unable to load MWI then just swallow the exception and don't allow
// the automagic hub registration
}
}

private static void OnAppDomainShutdown()
{
// Close all connections before the app domain goes down.
// Only signal all connections on a particular appdomain
AspNetHost.AppDomainTokenSource.Cancel();
AspNetHandler.AppDomainTokenSource.Cancel();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,26 @@

namespace SignalR.Hosting.AspNet
{
public class AspNetHost : HttpTaskAsyncHandler
public class AspNetHandler : HttpTaskAsyncHandler
{
private static readonly IDependencyResolver _defaultResolver = new DefaultDependencyResolver();
private static IDependencyResolver _resolver;

// This will fire when the app domain is shutting down
internal static readonly CancellationTokenSource AppDomainTokenSource = new CancellationTokenSource();

private readonly PersistentConnection _connection;

private readonly IDependencyResolver _resolver;

private static readonly Lazy<bool> _hasAcceptWebSocketRequest =
new Lazy<bool>(() =>
{
return typeof(HttpContextBase).GetMethods().Any(m => m.Name.Equals("AcceptWebSocketRequest", StringComparison.OrdinalIgnoreCase));
});

public AspNetHost(PersistentConnection connection)
public AspNetHandler(IDependencyResolver resolver, PersistentConnection connection)
{
_resolver = resolver;
_connection = connection;
}

public static IDependencyResolver DependencyResolver
{
get { return _resolver ?? _defaultResolver; }
}

public override Task ProcessRequestAsync(HttpContextBase context)
{
var request = new AspNetRequest(context.Request);
Expand All @@ -53,20 +47,9 @@ public override Task ProcessRequestAsync(HttpContextBase context)
hostContext.Items["System.Web.HttpContext"] = context;

// Initialize the connection
_connection.Initialize(DependencyResolver);
_connection.Initialize(_resolver);

return _connection.ProcessRequestAsync(hostContext);
}

public static void SetResolver(IDependencyResolver resolver)
{
if (resolver == null)
{
throw new ArgumentNullException("resolver");
}

_resolver = resolver;
}

}
}
2 changes: 0 additions & 2 deletions SignalR.Hosting.AspNet/AspNetRequest.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
using System;
using System.Collections.Specialized;
using System.Linq;
using System.Web;
using Microsoft.Web.Infrastructure.DynamicValidationHelper;
using SignalR.Hosting;

namespace SignalR.Hosting.AspNet
{
Expand Down
38 changes: 0 additions & 38 deletions SignalR.Hosting.AspNet/HubModule.cs

This file was deleted.

32 changes: 32 additions & 0 deletions SignalR.Hosting.AspNet/Routing/HubDispatcherRouteHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System;
using System.Web;
using System.Web.Routing;
using SignalR.Hubs;

namespace SignalR.Hosting.AspNet.Routing
{
public class HubDispatcherRouteHandler : IRouteHandler
{
private readonly string _url;
private readonly IDependencyResolver _resolver;

public HubDispatcherRouteHandler(string url, IDependencyResolver resolver)
{
_url = VirtualPathUtility.ToAbsolute(url);
_resolver = resolver;
}

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var hubLocator = new Lazy<BuildManagerTypeLocator>(() => new BuildManagerTypeLocator());
var typeResolver = new Lazy<BuildManagerTypeResolver>(() => new BuildManagerTypeResolver(hubLocator.Value));

_resolver.Register(typeof(IHubLocator), () => hubLocator.Value);
_resolver.Register(typeof(IHubTypeResolver), () => typeResolver.Value);

var dispatcher = new HubDispatcher(_url);

return new AspNetHandler(_resolver, dispatcher);
}
}
}
17 changes: 17 additions & 0 deletions SignalR.Hosting.AspNet/Routing/IgnoreJsRouteConstraint.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Web;
using System.Web.Routing;

namespace SignalR.Hosting.AspNet.Routing
{
public class IncomingOnlyRouteConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.IncomingRequest)
{
return true;
}
return false;
}
}
}
13 changes: 8 additions & 5 deletions SignalR.Hosting.AspNet/Routing/IncomingOnlyRouteConstraint.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
using System.Web;
using System;
using System.IO;
using System.Web;
using System.Web.Routing;

namespace SignalR.Hosting.AspNet.Routing
{
public class IncomingOnlyRouteConstraint : IRouteConstraint
public class IgnoreJsRouteConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.IncomingRequest)
if (Path.GetExtension(httpContext.Request.AppRelativeCurrentExecutionFilePath).Equals(".js", StringComparison.OrdinalIgnoreCase))
{
return true;
return false;
}
return false;

return true;
}
}
}
8 changes: 5 additions & 3 deletions SignalR.Hosting.AspNet/Routing/PersistentRouteHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,20 @@ namespace SignalR.Hosting.AspNet.Routing
public class PersistentRouteHandler : IRouteHandler
{
private readonly Type _handlerType;
private readonly IDependencyResolver _resolver;

public PersistentRouteHandler(Type handlerType)
public PersistentRouteHandler(Type handlerType, IDependencyResolver resolver)
{
_handlerType = handlerType;
_resolver = resolver;
}

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var factory = new PersistentConnectionFactory(AspNetHost.DependencyResolver);
var factory = new PersistentConnectionFactory(_resolver);
PersistentConnection connection = factory.CreateInstance(_handlerType);

return new AspNetHost(connection);
return new AspNetHandler(_resolver, connection);
}
}
}
37 changes: 35 additions & 2 deletions SignalR.Hosting.AspNet/Routing/RouteExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,48 @@ namespace SignalR.Hosting.AspNet.Routing
public static class RouteExtensions
{
public static RouteBase MapConnection<T>(this RouteCollection routes, string name, string url) where T : PersistentConnection
{
return MapConnection(routes, name, url, typeof(T), Global.DependencyResolver);
}

public static RouteBase MapConnection<T>(this RouteCollection routes, string name, string url, IDependencyResolver resolver) where T : PersistentConnection
{
return MapConnection(routes, name, url, typeof(T));
}

public static RouteBase MapConnection(this RouteCollection routes, string name, string url, Type type)
{
var route = new Route(url, new PersistentRouteHandler(type));
return MapConnection(routes, name, url, type, Global.DependencyResolver);
}

public static RouteBase MapHubs(this RouteCollection routes, string name, string url)
{
return MapHubs(routes, name, url, Global.DependencyResolver);
}

public static RouteBase MapHubs(this RouteCollection routes, string name, string url, IDependencyResolver resolver)
{
string routeUrl = url;
if (!routeUrl.EndsWith("/"))
{
routeUrl += "/{*operation}";
}

routeUrl = routeUrl.TrimStart('~').TrimStart('/');

var route = new Route(routeUrl, new HubDispatcherRouteHandler(url, resolver));
route.Constraints = new RouteValueDictionary();
route.Constraints.Add("Incoming", new IncomingOnlyRouteConstraint());
route.Constraints.Add("IgnoreJs", new IgnoreJsRouteConstraint());
routes.Add(name, route);
return route;
}

public static RouteBase MapConnection(this RouteCollection routes, string name, string url, Type type, IDependencyResolver resolver)
{
var route = new Route(url, new PersistentRouteHandler(type, resolver));
route.Constraints = new RouteValueDictionary();
route.Constraints.Add("PersistentConnectionConstraint", new IncomingOnlyRouteConstraint());
route.Constraints.Add("Incoming", new IncomingOnlyRouteConstraint());
routes.Add(name, route);
return route;
}
Expand Down
9 changes: 7 additions & 2 deletions SignalR.Hosting.AspNet/SignalR.Hosting.AspNet.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,21 @@
<Compile Include="BuildManagerTypeResolver.cs" />
<Compile Include="HttpCookieCollectionWrapper.cs" />
<Compile Include="HttpTaskAsyncHandler.cs" />
<Compile Include="HubModule.cs" />
<Compile Include="Infrastructure\TaskWrapperAsyncResult.cs" />
<Compile Include="AspNetHost.cs" />
<Compile Include="AspNetHandler.cs" />
<Compile Include="AspNetBootstrapper.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Routing\IgnoreJsRouteConstraint.cs" />
<Compile Include="Routing\HubDispatcherRouteHandler.cs" />
<Compile Include="Routing\IncomingOnlyRouteConstraint.cs" />
<Compile Include="Routing\PersistentRouteHandler.cs" />
<Compile Include="Routing\RouteExtensions.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SignalR.Hosting.Common\SignalR.Hosting.Common.csproj">
<Project>{3B71F0AE-D4B6-4F47-BF62-333D45615673}</Project>
<Name>SignalR.Hosting.Common</Name>
</ProjectReference>
<ProjectReference Include="..\SignalR\SignalR.csproj">
<Project>{1B9A82C4-BCA1-4834-A33E-226F17BE070B}</Project>
<Name>SignalR</Name>
Expand Down
Loading

0 comments on commit d539211

Please sign in to comment.