У меня есть настраиваемая система маршрутизации в моем веб-приложении, где у меня есть база данных с моими маршрутами (url
, Controller
, Action
и еще одна дополнительная информация). Каждый запрос, который делается на сервер, отправляется в базу данных, запрашивает этот маршрут по URL-адресу и возвращает набор, который мне нужно сохранить для будущего рендеринга Filter
, Controller
и View
, я храню эти данные в глобальном var на моем Global.asax файл:C# MVC Routing With RouteBase
public static class GlobalVars
{
public static Redirect reqContext { get; set; }
public static UnidadeHotSite HotSite { get; set; }
}
Моя проблема заключается в том, что сейчас эта информация становится смешано через пользователей, иногда, когда я нахожусь в своем браузере и у меня есть 3 открытых вкладок и я обновить их в «почти» то же самое время последнего будет получать данные маршрута предыдущего загруженного.
Например мой HotSite
вар сохраняет некоторую Subsite информацию как name
, url
, ID
и т.д., подсайт URL будет: abc.com/subsite. Когда я загружаю первую вкладку, я получаю правильные данные, которые являются данными субсайта, вторая вкладка находится за пределами области подсайта, abc.com, и я получаю те же данные, что и последняя загруженная вкладка.
Теперь, в чем проблема? Я уже использовал NoStore
на OutputCache
и попытался отключить сеанс, но ничего не работает.
Это мой путь Handler:
[OutputCache(NoStore = true, Duration = 0)]
public class RouteHandler : MvcRouteHandler
{
private static string RedirectAction { get; set; }
private static string UnidadeURL { get; set; }
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var friendlyUrl = (string)requestContext.RouteData.Values["RedirectUrl"];
var objRet = BuscaURL(friendlyUrl, requestContext);
GlobalVars.reqContext = objRet[0] as Redirect;
return base.GetHttpHandler(objRet[1] as RequestContext);
}
private static object[] BuscaURL(string pURL, RequestContext reqContext)
{
RedirectAction = "Index";
var isHotSite = BuscaHotSiteInfo(pURL);
var tRedirect = !isHotSite ? BuscaURLWS(pURL) : BuscaURLHS(pURL);
if(tRedirect == null || "NotFound".Equals(tRedirect.controller))
{
Configuracoes.GeraLog("pURL", pURL);
if(tRedirect == null)
Configuracoes.GeraLog("tRedirect", "NULL");
else
HelperController.GeraLog(tRedirect);
tRedirect = RedirectController.BuscaPaginaPorUrlWS(5);
RedirectAction = "Index";
reqContext.RouteData.DataTokens["Namespaces"] = "Site.Controllers";
}
if(tRedirect != null && tRedirect.paginaId > 0 && RedirectAction == "Index")
{
using(var db = new SkillSite())
{
var pagina = db.Pagina.First(x => x.ID == tRedirect.paginaId && x.ativo == 1);
RedirectAction = pagina.action;
}
}
reqContext.RouteData.Values["controller"] = tRedirect.controller;
reqContext.RouteData.Values["action"] = RedirectAction;
reqContext.RouteData.Values["id"] = tRedirect.ID;
return new object[] { tRedirect, reqContext };
}
private static Redirect BuscaURLHS(string pUrl)
{
Redirect redirect = null;
pUrl = pUrl.Replace(UnidadeURL, "").Replace("teste", "").TrimStart('/').TrimEnd('/');
if(!string.IsNullOrEmpty(pUrl) && !string.IsNullOrWhiteSpace(pUrl))
{
var splitUrl = pUrl.Split('/').ToList();
if(splitUrl.Count > 1)
{
if("cursos".Equals(splitUrl[0]))
{
if(splitUrl.Count == 2)
{
redirect = RedirectController.SearchPageByUrlWS(1, splitUrl[1]);
}
else if(splitUrl.Count == 3)
{
redirect = RedirectController.SearchPageByUrlWS(2, splitUrl[1], splitUrl[2]);
}
}
}
else
{
redirect = RedirectController.SearchPageByUrlWS(0, "", "", splitUrl[0]);
}
}
else
{
redirect = RedirectController.SearchPageByUrlWS(0, "", "", "home");
}
return redirect;
}
private static Redirect BuscaURLWS(string pUrl)
{
Redirect redirect = null;
if(!string.IsNullOrEmpty(pUrl) && !string.IsNullOrWhiteSpace(pUrl))
{
var splitUrl = pUrl.TrimEnd('/').Split('/').ToList();
if(splitUrl.Count > 1)
{
if("cursos".Equals(splitUrl[0]))
{
if(splitUrl.Count == 2)
{
redirect = RedirectController.SearchPageByUrlHS(1, splitUrl[1]);
}
else if(splitUrl.Count == 3)
{
redirect = RedirectController.SearchPageByUrlHS(2, splitUrl[1], splitUrl[2]);
}
}
}
else
{
redirect = RedirectController.SearchPageByUrlHS(0, "", "", splitUrl[0]);
}
}
else
{
redirect = RedirectController.SearchPageByUrlHS(0, "", "", "home");
}
return redirect;
}
}
Это контроллер, который делает поисковые запросы на DB
[OutputCache(NoStore = true, Duration = 0)]
public class RedirectController
{
public static Redirect SearchPageByUrlWS(int tipo, string cursoCURL = "", string cursoURL = "", string redirectURL = "", string redirectURLTwo = "")
{
using(var db = new Site())
{
IQueryable<Redirect> redirects;
if(tipo == 1)
{
redirects = from redirect in db.Redirect
where redirect.url == cursoCURL && redirect.cursoCatId > 0
select redirect;
}
else
{
redirects = from redirect in db.Redirect
where redirect.url == redirectURL &&
redirect.cursoCatId == 0 &&
redirect.regulamentoId == 0 &&
redirect.noticiaId == 0 &&
redirect.ebookId == 0 &&
redirect.conhecaId == 0
select redirect;
}
return (redirects.ToList().Count > 0) ? redirects.ToList()[0] : null;
}
}
public static HS_Redirect SearchPageByUrlHS(int tipo, string cursoCURL = "", string cursoURL = "", string redirectURL = "", string redirectURLTwo = "")
{
using(var dbHS = new HS())
{
IQueryable<HS_Redirect> redirects;
if(tipo == 4)
{
redirects = from redirect in dbHS.HS_Redirect
where redirect.url == redirectURL && redirect.noticiaId > 0 && redirect.unidadeCE == GlobalVars.HotSite.unidadeHS.unidadeCE
select redirect;
}
else
{
redirects = from redirect in dbHS.HS_Redirect
where
redirect.url == redirectURL &&
redirect.cursoCatId == 0 &&
redirect.regulamentoId == 0 &&
redirect.noticiaId == 0 &&
redirect.ebookId == 0 &&
redirect.conhecaId == 0
select redirect;
}
return (redirects.ToList().Count > 0) ? redirects.ToList()[0] : null;
}
}
}
EDIT:
мне удалось сделать @ NightOwl888 ответ работа с областями и всем остальным, что мне нужно, я не собираюсь публиковать это здесь, так как он немного большой, вот вот код: http://pastebin.com/yTdWKMp4
EDIT 2
Я обновил файл на Pastebin с некоторыми изменениями, чтобы улучшить скорость и удобство использования: http://pastebin.com/yTdWKMp4
Используйте словарь 'Session' **, а не статическую глобальную переменную **, чтобы хранить информацию о пользователях. – Jasen
Дело в том, что я не храню информацию пользователя, а информацию о странице, маршруте и контроллере ... они не основаны на пользователе – Terkhos
Каждый запрос перезаписывает статическую глобальную переменную. – Jasen