2015-04-03 10 views
3

У нас есть приложение Sass, в котором мы только что внедрили собственный механизм просмотра бритв, чтобы мы могли использовать разные представления на основе текущего пользователя, входящего в систему. все это прекрасно работало. Тем не менее, в разделе «Производство» (общий веб-хост) мы сталкиваемся с периодическими проблемами, пытаясь обслуживать несуществующее представление, используя неправильный путь просмотра.Проблема с прерывистым просмотром пути с пользовательским механизмом просмотра бритвы MVC

Что происходит, так это то, что после развертывания он работает нормально. Затем примерно через 20-30 минут мы начинаем получать не найденные ошибки. Если я изменил файл web.conf, чтобы перезапустить пул приложений, все снова отлично работает ... на некоторое время.

Похоже, что метод FileExists в некоторых случаях возвращает true для этих путей. Не уверен, связано ли это с проблемой кэширования или находится на общем хосте, webfarm, несколько запросов для одной и той же страницы, в то же время получая результаты от FileExists, скрещенных и т. Д. ??? Понятия не имею.

Ошибка:

System.Web.HttpException: The file '/Areas/OrderMgmt/Views/HH/ManageOrders/Pickup.cshtml' does not exist. 

В приведенном выше случае, эта точка зрения не существует, то он находится в папке _Образы базовой: /Areas/OrderMgmt/Views/HH/ManageOrders/Pickup.cshtml

Ниже приведен код пользовательского вид двигателя:

{ 
//http://lonetechie.com/2012/09/25/multi-tenant-architecture-with-asp-net-mvc-4/ 
public class MulitTenantRazorViewEngine : RazorViewEngine 
{ 
    public const string baseFolderPath = "_Base"; 

    public MulitTenantRazorViewEngine() 
    { 
     _logger = LogManager.GetLogger(GetType()); 

     AreaViewLocationFormats = new[] { 
     "~/Areas/{2}/Views/%1/{1}/{0}.cshtml", 
     "~/Areas/{2}/Views/%1/{1}/{0}.vbhtml", 
     "~/Areas/{2}/Views/%1/Shared/{0}.cshtml", 
     "~/Areas/{2}/Views/%1/Shared/{0}.vbhtml", 
     "~/Areas/{2}/Views/_Base/{1}/{0}.cshtml", 
     "~/Areas/{2}/Views/_Base/{1}/{0}.vbhtml", 
     "~/Areas/{2}/Views/_Base/Shared/{0}.cshtml", 
     "~/Areas/{2}/Views/_Base/Shared/{0}.vbhtml" 
     }; 

     AreaMasterLocationFormats = new[] { 
     "~/Areas/{2}/Views/%1/{1}/{0}.cshtml", 
     "~/Areas/{2}/Views/%1/{1}/{0}.vbhtml", 
     "~/Areas/{2}/Views/%1/Shared/{0}.cshtml", 
     "~/Areas/{2}/Views/%1/Shared/{0}.vbhtml", 
     "~/Areas/{2}/Views/_Base/{1}/{0}.cshtml", 
     "~/Areas/{2}/Views/_Base/{1}/{0}.vbhtml", 
     "~/Areas/{2}/Views/_Base/Shared/{0}.cshtml", 
     "~/Areas/{2}/Views/_Base/Shared/{0}.vbhtml" 
     }; 

     AreaPartialViewLocationFormats = new[] { 
     "~/Areas/{2}/Views/%1/{1}/{0}.cshtml", 
     "~/Areas/{2}/Views/%1/{1}/{0}.vbhtml", 
     "~/Areas/{2}/Views/%1/Shared/{0}.cshtml", 
     "~/Areas/{2}/Views/%1/Shared/{0}.vbhtml", 
     "~/Areas/{2}/Views/_Base/{1}/{0}.cshtml", 
     "~/Areas/{2}/Views/_Base/{1}/{0}.vbhtml", 
     "~/Areas/{2}/Views/_Base/Shared/{0}.cshtml", 
     "~/Areas/{2}/Views/_Base/Shared/{0}.vbhtml" 
     }; 

     ViewLocationFormats = new[] { 
     "~/Views/%1/{1}/{0}.cshtml", 
     "~/Views/%1/{1}/{0}.vbhtml", 
     "~/Views/%1/Shared/{0}.cshtml", 
     "~/Views/%1/Shared/{0}.vbhtml", 
     "~/Views/_Base/{1}/{0}.cshtml", 
     "~/Views/_Base/{1}/{0}.vbhtml", 
     "~/Views/_Base/Shared/{0}.cshtml", 
     "~/Views/_Base/Shared/{0}.vbhtml" 
     }; 

     MasterLocationFormats = new[] { 
     "~/Views/%1/{1}/{0}.cshtml", 
     "~/Views/%1/{1}/{0}.vbhtml", 
     "~/Views/%1/Shared/{0}.cshtml", 
     "~/Views/%1/Shared/{0}.vbhtml", 
     "~/Views/_Base/{1}/{0}.cshtml", 
     "~/Views/_Base/{1}/{0}.vbhtml", 
     "~/Views/_Base/Shared/{0}.cshtml", 
     "~/Views/_Base/Shared/{0}.vbhtml" 
     }; 

     PartialViewLocationFormats = new[] { 
     "~/Views/%1/{1}/{0}.cshtml", 
     "~/Views/%1/{1}/{0}.vbhtml", 
     "~/Views/%1/Shared/{0}.cshtml", 
     "~/Views/%1/Shared/{0}.vbhtml", 
     "~/Views/_Base/{1}/{0}.cshtml", 
     "~/Views/_Base/{1}/{0}.vbhtml", 
     "~/Views/_Base/Shared/{0}.cshtml", 
     "~/Views/_Base/Shared/{0}.vbhtml" 
     }; 
    } 

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     var PassedController = controllerContext.Controller as BaseController; 
     Debug.Assert(PassedController != null, "PassedController != null"); 
     return base.CreatePartialView(controllerContext, GetTenantViewPath(partialPath, PassedController)); 
    } 

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     var PassedController = controllerContext.Controller as BaseController; 
     Debug.Assert(PassedController != null, "PassedController != null"); 
     return base.CreateView(controllerContext, GetTenantViewPath(viewPath, PassedController), GetTenantViewPath(masterPath, PassedController)); 
    } 

    protected override bool FileExists(ControllerContext controllerContext, string virtualPath) 
    { 
     var PassedController = controllerContext.Controller as BaseController; 
     Debug.Assert(PassedController != null, "PassedController != null"); 
     var tenantViewPath = GetTenantViewPath(virtualPath, PassedController); 

     var isFound = base.FileExists(controllerContext, tenantViewPath); 
     _logger.Debug(String.Format("Is Found: {0} Path: {1}.", isFound.ToString(), tenantViewPath)); 

     return isFound; 
    } 

    private string GetTenantViewPath(string virtualPath, BaseController PassedController) 
    { 
     string strReplacementString = ""; 

     if (PassedController == null) 
     { 
      strReplacementString = baseFolderPath; 
     } 

     else if(PassedController.User == null) { 
      strReplacementString = baseFolderPath; 
     } 
     else 
     { 
      strReplacementString = PassedController.User.CurrentAccountCode ?? baseFolderPath; 
     } 


     return virtualPath.Replace("%1", strReplacementString); 
    } 

    private readonly ILog _logger; 
} 

}

+0

Предлагаю вам изменить свой вопрос и выбрать лучшие теги. Пользовательский механизм просмотра не имеет ничего общего с маршрутизацией .NET. – NightOwl888

ответ

4

Оказывается, что в режиме деблокирования используется кеширование, которое c а также проблемы, которые у меня были. Вам также необходимо переопределить методы FindView и FindPartialView и установить для useCache значение false:

//to not used Cached paths. see one of the comments here: http://lonetechie.com/2012/09/25/multi-tenant-architecture-with-asp-net-mvc-4/ 
     public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
     { 
      return base.FindView(controllerContext, viewName, masterName, false); 
     } 

     //to not used Cached paths. see one of the comments here: http://lonetechie.com/2012/09/25/multi-tenant-architecture-with-asp-net-mvc-4/ 
     public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) 
     { 
      return base.FindPartialView(controllerContext, partialViewName, false); 
     } 
+0

Спасибо ** много **! У нас был точно такой же сценарий, и мой коллега просто наткнулся на ваш ответ, который, похоже, решил проблему. – Anil

+0

@ Радует, что это вам помогло! –

+0

Чувак, вам нужно быть рыцарем королевы! Большое спасибо @ChadRichardson !! – ProxyTech

 Смежные вопросы

  • Нет связанных вопросов^_^