如何在IIS 7中托管多个网站并为所有网站使用相同的MVC应用程序?

时间:2013-04-11 02:18:52

标签: asp.net-mvc-4 iis-7.5

如何在IIS 7中托管多个网站,并为所有网站使用相同的MVC应用程序,例如每个网站:

  1. 有它自己的根目录,所以用户可以上传自己的文件(html,css,javascript),而不会看到其他网站的内容

  2. 使用相同的MVC应用程序 - 因此对应用程序的更新会影响所有网站

  3. 用户不能以任何方式影响MVC应用程序(最好是隐藏它们)

  4. 谢谢!

2 个答案:

答案 0 :(得分:1)

  1. 创建一个部署MVC文件的目录,名为“AppFoo”。请注意,配置文件web.config将在所有站点之间共享,您必须通过查看Host HTTP标头或其他绑定信息在按需运行时加载每站点配置。
  2. 在IIS中创建每个网站,并使其使用您创建的应用程序目录。理想情况下,每个网站都在自己的应用程序池中运行,并拥有自己的用户帐户,所有用户帐户都可以访问AppFoo目录。
  3. 在某处创建新目录,例如在C:\Inetpub\sites\WebsiteAWebsiteB等。每个文件夹重新设置NTFS权限ACL,只允许每个网站的应用程序池用户访问。在这些创建文件夹中称为“内容”,“视图”和“日志”
  4. 对于IIS中的每个网站(我假设您使用的是根),设置一个名为“内容”和“视图”的虚拟目录(我假设您已经设置了MVC应用程序),将这些映射到您在步骤3中创建的文件夹的子目录。
  5. 对于每个网站,请转到“日志记录”页面,并将日志路径设置为您在步骤3中为该站点创建的Logs目录。
  6. 请注意,此计划基于MVC评估其VirtualPathProvider中的IIS虚拟目录的假设。如果没有,那么你将不得不推出自己的VirtualPathProvider,以便按主机名加载每个网站的内容。

答案 1 :(得分:0)

如果您运行的是一个代码库,请设置一个使用domain routing的网站或全局过滤器来捕获域,保存并将其用作文件夹的密钥等等。

public class DomainFilterAttribute : ActionFilterAttribute
{
    private SiteDomainRepository _siteDomainRepository = new SiteDomainRepository();

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var viewBag = filterContext.Controller.ViewBag;
        var host = HttpContext.Current.Request.IsLocal ? "www.testdomain.com" : HttpContext.Current.Request.Url.Host;
        var domain = hostSplit[1];

        var siteDomain = _siteDomainRepository.GetByRowKey(domain);

        viewBag.DomainName = host.ToLower();
        viewBag.Domain = siteDomain.RowKey;
        viewBag.Class = siteDomain.Key;
        viewBag.TrackingCode = siteDomain.TrackingCode;
    }
}