Category Archives: ASP.NET

EntitySpaces – Access Multiple Databases Dynamically

I’ve been using EntitySpaces ORM ( for a number of years now in my consulting work. They recently (late 2012) shut up shop and open sourced the code. It was a bit of a shame, not to mention quite surprising, as I thought they were a great company with a great product. But I’m very grateful they open sourced the project and it’s available for download from… the full product, with all the tools, bells and whistles! Awesome stuff.

I recently came across the problem of how to dynamically access multiple databases for an Admin app I was building. A customer has 5 different databases that the Admin user can access to create, update or delete certain records. There can be multiple users logged in at once and therefore we need each user’s current database choice to be independent of each other. But I had a problem.

Normally, you would simply store the database choice (eg: country) in the users session ready for access whenever you need to hit the database. EntitySpaces has a nice mechanism for doing this. They provide an IConnectionNameService interface:

You add the database name to your session, and then when you call the EntitySpaces code, it will invoke the GetName() method and retrieve it from the session again and dynamically set which connection string to use from your web.config file.

This will work just fine on one condition – your database access code is running in the ASP.NET session context! What if your code is running in a separate .dll that is included in the project and knows nothing about the web, or ASP.NET or HTTP etc…??

You could try some of the following options:

  1. Pass the database name around from the web context to the DAL code. This means muddying the code with extra parameters and somehow keeping track of user context and thread safety.
  2. Create some sort of alternate collection to track which user is needing to connect to each database. maybe a hashtable/dictionary for quick look up. Here you would need to link back to the lookup class from anywhere where the database was being called.
  3. Find another mechanism for storing the user context and hooking into the EntitySpaces provided IConnectionNameService interface.

Options 1 and 2 simply aren’t practical and would make the code simply too messy. Option 3 though, has potential and with a bit of lateral thinking will provide the best solution.

Given that we are running in a web context on the ASP.NET stack, we have access to the Web Security framework and if we have an authenticated user who has logged in with their email address as their username, for example, we can use the current security context on the current thread as a unique way of storing the name of the database we want to connect to.

If I’m logged into my website then security identity context is going to hold the following information (I’m using forms authentication):

You can see that the Identity holds my login username – in this case my email address. So we can use this as a system wide unique ‘key’ into some collection where we can store which database name we want.

  1. We need a data store that is going to be accessible when the web application first fires up.
  2. We need to be able to store a reference to it that will persist and still be around independent of the ASP.NET Session.
  3. It would be nice to have some thread safety mechanism to allow for synchronized access.

A very nice and handy solution that ticks these boxes is the AppStart Dictionary which is automatically available to all pages in the website. It has the added benefits of providing synchronized access with it’s Lock() and UnLock() methods. We could use the global cache, and this would work quite nicely, but it doesn’t have synchronized access, although it does provide fine grain control over the life of the objects stored in it.

In a WebPages Razor website you would setup your EntitySpaces connection in the _AppStart.cshtml page:

We pass in a reference to the AppState ready to be accessed when the DAL code comes looking for which connection string to use. Here is our implementation of the IConnectionNameService interface:

Now, all we have to do is store the database name in the AppState global dictionary when the user is about to request something from the database:

Our Identity.Name ( address) should be the same here as when the IConnectionNameService interface implementation is called later in the DAL custom .dll. Using a drop down select box in the web interface, you can dynamically change the database to connect to with each request.

As long as you store the country in the AppState dictionary, the EntitySpaces framework will pick it up and dynamically set it correctly each time. Very nice!

ASP.NET Sessions

Did you know that if you don’t put anything into an ASP.NET session, it will generate a new one with EVERY page request!!???

Try it out for yourself…

  • Create a new MVC(3/4) Web App in Visual Studio.
  • Choose the Razor rendering engine
  • Add the following code to index.cshtml

Run the website and you will see that the Session ID is different every time you click back to, or refresh the index page!

At first I though this was because I wasn’t logged in. If I go to the Register.cshtml page and create a new account, and login with it, this behaviour still persists.

It’s only when you add something to the session that you see the same Session ID being reused.

Go to the About.cshtml page and add the following code:

Run the app again, and make a note of the Session ID on the index.cshtml page. Next click the About menu tab, and then go back to the Home tab. You will see that your Session has been persisted because you added today’s name into the collection.

Why does it work this way? I’m not really sure. If you have any ideas, I’d be happy to hear them.

IIS 7.5 Unable to serve .cshtml files

I’m playing with WebMatrix and deploying my web site, but when I try to access it, I get the following error:

HTTP Error 404.17 – Not Found. The requested content appears to be script and will not be served by the static file handler.” 

After a bit of hunting around I found that the default .net framework associated with an Application Pool under IIS 7.x seems to be v2.0! To run a Razor site (and display .cshtml files) you must have .Net Framework v4.0 selected for the assigned application pool.

  • To do this, open up the IIS Manager Console (inetmgr.exe). 
  • Expand the hostname node in the “Connections” panel on the left hand side. 
  • Select the “Application Pools” node. 
  • All the App Pools will display in the centre pane, with their details, including which .Net Framework they are running.
  • If your site’s application pool is showing v2.0, double click it and change it to “v4.0 Integrated/Classic” (which ever you need) and then click the OK button to save it. 
  • With the app pool still selected in the main pane, click the “Recycle…” link in the “Actions” panel on the right hand side. This will ensure that the app pool is recycled and restarted with the correct .Net Framework loaded. 
  • Now go back to your website and reload your .cshtml file. It should appear as expected!

ASP.NET Uri Properties

If you’re anything like me, I can never remember just which Uri properties spit out what info. It’s only when I need to use one of them that I have to try and figure ouy which is which. Invariably I end up writing a quick and dirty little command line app that spits out the various properties that are hard to remember. So here they are once and for all so I won’t have to remember them again.

Original Url:

AbsolutePath: /library/system.uri.aspx
      Fragment: #search
  HostNameType: Dns
 IsDefaultPort: True
     LocalPath: /library/system.uri.aspx
  PathAndQuery: /library/system.uri.aspx?pageNo=1
         Query: ?pageNo=1

UTF-8 Text in ASP.NET

If you are trying to display non-english characters in your ASP.NET page the following might be helpful. I recently was working on some landing pages for different languages and the text was displaying correctly in Visual Studio, however when I viewed it in a web browser, it wasn’t displaying correctly.

After reading through this brilliant blog post by Milan Negovan, I made the following change to the globalization tag:

changed to this:

fileEncoding=”utf-8″ />

Read Milan’s post for a complete explanation, but suffice it to say, you will need to set the file encoding to that the page will be rendered correctly.