У нас есть приложение 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;
}
}
Предлагаю вам изменить свой вопрос и выбрать лучшие теги. Пользовательский механизм просмотра не имеет ничего общего с маршрутизацией .NET. – NightOwl888