Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to implement a Multi-Tenant-Asp.net MVC application?

I have an Asp.net MVC3 application I want to be able to allow multiple/ different clients to access the same application but using different url's. I have already managed to configure the database to allow this. So hia's the main part i want to host my application in a domain say... www.myapplication.com then allow different client to access the same application using 1.www.clientOne.myapplication.com 2.www.clientTwo.myapplication.com.

How to do it? Please provide the code. Thanks.

like image 927
arunkumar.halder Avatar asked Mar 23 '26 23:03

arunkumar.halder


2 Answers

Stack Exchange itself runs on a multi-tenant architecture!

http://weblogs.asp.net/zowens/archive/2010/06/16/multi-tenant-asp-net-mvc-views.aspx

This set of articles should get you what you need to set up your basic architecture. It has plenty of code and does a pretty good job at covering what you'd need. I don't think you're going to get the exact code that you need here to set up the entire core architecture of your multi tenan application, I'd advise using either this article above or ones like it.

like image 163
Jeff Turner Avatar answered Mar 26 '26 11:03

Jeff Turner


To implement multi tenant application you have to do some tricks in

C:\Windows\System32\drivers\etc host file 

and some coding tricks in App_Start folder at RouteConfig.Csfile by inheriting and implementing IRouteConstraint interface. Also need to see bindings settings in IIS server(for this you need to see the video tutorial provided in below link)

You can get a complete code here https://github.com/ashikcse20/ASP-MVC5-MULTI-TENANT-REPOSITORY with complete written tutorial.

The video tutorial is given here ASP .NET MVC 5 Multi Tenant Example With Basic Code (Single Database Per Tenant)

Code in RouteConfig.Cs at RegisterRoutes function

routes.MapRoute(
            name: "Default", url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            constraints: new { TenantRouting = new RoutingConstraint() }
                 );

Inheriting and implementing IRouteConstraint Interface

 public class RoutingConstraint : IRouteConstraint // It is main Class for Multi teanant
 { 

      public bool Match(HttpContextBase httpContext, Route route, string getParameter, RouteValueDictionary values, RouteDirection routeDirection)
      {
            // Got htis code from  http://blog.gaxion.com/2017/05/how-to-implement-multi-tenancy-with.html
            var GetAddress = httpContext.Request.Headers["Host"].Split('.'); 
            var tenant = GetAddress[0];
            //Here you can apply your tricks and logic. Note for when you put it in public server then www.hamdunsoft.com , www.tenant1.hamdunsoft.com then you need to change a little bit in the conditions . Because a www. was added.
            if (GetAddress.Length < 2) // See here for localhost:80 or localhost:9780 ohh also for hamdun soft  execution will enter here . But for less than 2? will hamdunsoft.com enter here?
            {
                 tenant = "This is the main domain";

                 Constant.DatabaseName = "TEST";
                 if (!values.ContainsKey("tenant"))
                      values.Add("tenant", tenant);
                 //return false;
                 // return true;
            }
             else if (GetAddress.Length == 2) //   execution will enter here  for  hamdunsoft.com enter here but not for www.hamdunsoft.com
            {
                 tenant = "This is the main domain";

                 Constant.DatabaseName = GetAddress[0];  
                 if (!values.ContainsKey("tenant"))
                      values.Add("tenant", tenant);
                 //return false;
                 // return true;
            }
            else if (!values.ContainsKey("tenant")) // for tenant1.hamdunsoft.com execution will enter here
            {
                 values.Add("tenant", tenant);
                 Constant.DatabaseName = GetAddress[1]+"."+ tenant;
            }

            return true;
      }
 }
like image 33
Muhammad Ashikuzzaman Avatar answered Mar 26 '26 13:03

Muhammad Ashikuzzaman



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!