Get an unique session in each browser tab

I got a lot to do at work, hence the silence. I got a lot to blog about, but so little time ;/ I found an interesting question at stackoverflow which this answer is for (also to show you that the blog is not forgotten).

A user wanted to store browser tab specific data which can be a problem since most browsers shares a session between different tabs. The solution is to create a new route which generates a GUID and then
use that guid to fetch and store session information. Keep in mind that you need to routes: One that works for users which just surfed into the site, and one that loads an existing guid.

Here is the route class:

public class GuidRoute : Route
	private readonly bool _isGuidRoute;

	public GuidRoute(string uri, object defaults)
		: base(uri, new RouteValueDictionary(defaults), new MvcRouteHandler())
		_isGuidRoute = uri.Contains("guid");

		DataTokens = new RouteValueDictionary();

	public override RouteData GetRouteData(HttpContextBase httpContext)
		var routeData = base.GetRouteData(httpContext);
		if (routeData == null)
			return null;

		if (!routeData.Values.ContainsKey("guid") || routeData.Values["guid"].ToString() == "")
			routeData.Values["guid"] = Guid.NewGuid().ToString("N");

		return routeData;

	public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
		return !_isGuidRoute ? null : base.GetVirtualPath(requestContext, values);

Replace the default route in global.asax with it:

	"Default", // Route name
	"{controller}/{action}/{id}", // URL with parameters
	new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

routes.Add("Default", new GuidRoute(
	new { controller = "Home", action = "Index", guid = "", id = UrlParameter.Optional }));

routes.Add("GuidRoute", new GuidRoute(
	new { controller = "Home", action = "Index", guid = "", id = UrlParameter.Optional }));

And finally some extension methods to make life easier in the controllers:

public static class ControllerExtensionMethods
	public static string GetGuid(this Controller controller)
		return controller.RouteData.Values["guid"].ToString();

	public static void SetGuidSession(this Controller controller, string name, object value)
		controller.Session[controller.GetGuid() + "_" + name] = value;

	public static object GetGuidSession(this Controller controller, string name)
		return controller.Session[controller.GetGuid() + "_" + name];

One thing left though: Any browser bookmarks will use an old GUID. Should not be a problem in most cases (unless the user opens the bookmark in multiple tabs = sharing the session between the tabs). Same
thing goes for opening a link in a new tab = shared.


  • Reply shyam |

    Thanks a lot for the explanation.. It really bring some ray of hope to my problem that is in (without MVC).

    Can you please guide me on hw to implement this fix in

  • Reply Anjan |

    Nice Article. Is there any way to avoid appending GUID in URL and managing from route data during the postbacks.

  • Reply Mohamed Asane |

    Could you please guid me, How I can use with mvc area registration?




    new { action = “Index”, id = UrlParameter.Optional }


    • Reply VP |

      Did you get an answer for this? I am trying to solve the same issue, pl let me know if you were able to do this with RegisterArea?

  • Reply Chuck Bryan |

    Nice article. Everything worked fine until I went back to Home/Index. I ended up swapping the routes registration and it worked!

  • Reply Moeg |

    Hi, is there a sample solution which implements this? I can’t seem to get it to work – although my routeData gets populate with a GUID my URL doesn’t, i.e. my URL is always http://localhost:51179/ or http://localhost:51179/Home/Index. I was expecting to have the GUID appended to the URL? A working solution would be great to be able to go through. Here’s hoping..

      • Reply Moeg |

        I got it working thanks. Is there a way to access the Guid stored in the RouteData from within another project, say, for example, a WCF service layer?

      • Reply Moeg |

        Is the best way to get the GUID from a separate project (e.g. class library) to just retrieve it from the query string?

      • Reply Siyabulela Mooi |

        This is what I have done in my application:

        RouteConfig.RegisterRoutes(RouteTable.Routes); in the “Application_Start() of the Global.asax file.

        public static void RegisterRoutes(RouteCollection routes)




        // name: “Default”,

        // url: “{controller}/{action}/{id}”,

        // defaults: new { controller = “DeviceManager”, action = “DeviceDetails”, id = UrlParameter.Optional }


        routes.Add(“Default”, new GuidRoute(


        new { controller = “DeviceManager”, action = “DeviceDetails”, guid = “”, id = UrlParameter.Optional }));

        routes.Add(“GuidRoute”, new GuidRoute(


        new { controller = “Home”, action = “Index”, guid = “”, id = UrlParameter.Optional }));


        This still doesn’t append the Giuid in the URL.

So, what do you think ?