Итак,
У меня есть сайт MVC 2 на IIS 6 (подстановочные карты сопоставления / aspnet_isapi.dll), где мы хотим перенаправлять людей на разные URL-адреса в зависимости от их предпочтительного расположения, скажем, la.acme.com против nyc.acme .com.
Я не хочу, чтобы кто-нибудь попал на www.acme.com или acme.com.
Чтобы добиться этого, я делаю следующее (я признаю, что это может быть не лучшим способом, поэтому я задаю этот вопрос):
В моем базовом контроллере я делаю следующее:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
ReturnURL = requestContext.HttpContext.Request.Url.PathAndQuery;
BaseUrl = requestContext.HttpContext.Request.Url.Host;
if (!requestContext.HttpContext.Request.Url.IsDefaultPort) {
BaseUrl += ":" + requestContext.HttpContext.Request.Url.Port;
}
ViewData["BaseUrl"] = BaseUrl;
base.Initialize(requestContext);
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
var route = filterContext.RequestContext.RouteData;
var controller = route.GetRequiredString("controller");
var action = route.GetRequiredString("action");
string basePlusHttp = "http://" + BaseUrl;
string basePlusHttps = "https://" + BaseUrl;
string actionsToSkip = "ChooseCity|DisplayPhoto|ChooseLocation|Press|ContactUs|AboutUs|TermsOfService|PrivacyPolicy|Logon|Register|Prospect|";
if (!actionsToSkip.Contains(action + "|")) {
if (BaseUrl.Contains("www.acme.com") || basePlusHttp.StartsWith("http://acme.com") || basePlusHttps.StartsWith("https://acme.com")) {
if (filterContext.HttpContext.Request.Cookies["StoreLocationID"] != null && Convert.ToInt32(filterContext.HttpContext.Request.Cookies["StoreLocationID"].Value) > 0) {
filterContext.HttpContext.Response.Redirect("/Home/ChooseCity/" + Convert.ToInt32(filterContext.HttpContext.Request.Cookies["StoreLocationID"].Value) + "?returnURL=" + ReturnURL);
} else {
aspnet_User user = Repository.GetAspnet_User(filterContext.HttpContext.User.Identity.Name);
if (user != null) {
if (user.StoreLocationID != null) {
int storeLocationID = Convert.ToInt32(user.StoreLocationID);
filterContext.HttpContext.Response.Redirect("/Home/ChooseCity/" + storeLocationID + "?returnURL=" + ReturnURL);
} else {
//get location by IP
string zip = getZipFromIP();
if (!string.IsNullOrEmpty(zip)) {
var zipCode = Repository.GetZipCode(zip);
if (zipCode != null) {
var storeLocation = Repository.GetStoreLocationByZipCodeID(zipCode.ZipCodeID);
if (storeLocation != null) {
filterContext.HttpContext.Response.Redirect("/Home/ChooseCity/" + storeLocation.StoreLocationID + "?returnURL=" + ReturnURL);
} else {
filterContext.HttpContext.Response.Redirect("/Home/ChooseLocation/");
}
} else {
filterContext.HttpContext.Response.Redirect("/Home/ChooseLocation/");
}
} else {
filterContext.HttpContext.Response.Redirect("/Home/ChooseLocation/");
}
}
} else {
//get location by IP
string zip = getZipFromIP();
if (!string.IsNullOrEmpty(zip)) {
var zipCode = Repository.GetZipCode(zip);
if (zipCode != null) {
var storeLocation = Repository.GetStoreLocationByZipCodeID(zipCode.ZipCodeID);
if (storeLocation != null) {
filterContext.HttpContext.Response.Redirect("/Home/ChooseCity/" + storeLocation.StoreLocationID + "?returnURL=" + ReturnURL);
} else {
filterContext.HttpContext.Response.Redirect("/Home/ChooseLocation/");
}
} else {
filterContext.HttpContext.Response.Redirect("/Home/ChooseLocation/");
}
} else {
filterContext.HttpContext.Response.Redirect("/Home/ChooseLocation/");
}
}
}
} else { //make sure the storelocation chookie value is correct based on the URL...we should not have a nyc.acme.com url with an 'la' cookie.
if (BaseUrl.Contains("nyc.")) {
if (filterContext.HttpContext.Request.Cookies["StoreLocationID"] == null) {
filterContext.HttpContext.Response.Redirect("/Home/ChooseCity/3?returnURL=" + ReturnURL);
} else {
if (filterContext.HttpContext.Request.Cookies["StoreLocationID"].Value != "3") {
filterContext.HttpContext.Response.Redirect("/Home/ChooseCity/3?returnURL=" + ReturnURL);
}
}
}
if (BaseUrl.Contains("la.")) {
if (filterContext.HttpContext.Request.Cookies["StoreLocationID"] == null) {
filterContext.HttpContext.Response.Redirect("/Home/ChooseCity/5?returnURL=" + ReturnURL);
} else {
if (filterContext.HttpContext.Request.Cookies["StoreLocationID"].Value != "5") {
filterContext.HttpContext.Response.Redirect("/Home/ChooseCity/5?returnURL=" + ReturnURL);
}
}
}
}
}
base.OnActionExecuted(filterContext);
}
Вот краткое описание длинного кода в OnActionExecuted
выше:
если пользователь находится в «действии», где мы разрешаем www.acme.com или acme.com (например, PrivacyPolicy), тогда не беспокойтесь о дальнейших действиях;
если в URL-адресе содержится «www» или он не содержит префикса города, то давайте двигаться дальше, когда нам нужно исправить ситуацию;
если у них есть файл cookie (StoreLocationID), в котором указан их предпочитаемый город, перенаправьте его в / Home / ChooseCity, где мы установим другие файлы cookie, и перенаправим на правильный URL-адрес: nyc.acme.com или la.acme. ком.
если они вошли в систему и если в их учетной записи указан предпочтительный город, используйте его (перенаправить на / Home / ChooseCity - то же, что 3 выше)
у них нет файлов cookie и они не сохраняются в учетной записи пользователя, поэтому используйте их IP-адрес, чтобы получить почтовый индекс и посмотреть, находится ли этот почтовый индекс в городе или вокруг нас, если так, отправьте его в / Home / ChooseCity, как в 3 и 4 выше
наконец, если мы не можем определить, какой город они предпочитают, мы можем выбрать их вручную в / Home / ChooseLocation /
Это все работает . НО, мы начинаем замечать следующее в случайное время ...
Иногда (и без видимого шаблона) пользователь щелкает ссылку и в итоге попадает на совершенно случайную страницу (а не место назначения по нажатой ссылке). Может показаться, что местоположение, в котором они оказываются, обычно является местоположением, которое, возможно, запрашивал другой пользователь (за исключением городов) (я знаю, что вы думаете о квантовой запутанности, но я исключил это). Как будто IIS запутывается из-за того, кого за что спрашивают.
Мой вопрос (после всего этого) заключается в том, может ли приведенная выше логика (в OnActionExecuted
) вызывать отключение IIS? Следует отметить, что проблема «случайных расположений» возникает даже у пользователей с nyc или la в URL-адресе ... пользователей, которые имеют надлежащий cookie-файл для хранения. Это означает, что пользователь никогда не должен перенаправляться на «/ Home / ChooseCity» или «/ Home / ChooseLocation», так как они имеют правильную конфигурацию URL и файлов cookie.