Переопределение OnActionExecuted и получение странных ответов IIS - PullRequest
1 голос
/ 01 декабря 2010

Итак,

У меня есть сайт 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 выше:

  1. если пользователь находится в «действии», где мы разрешаем www.acme.com или acme.com (например, PrivacyPolicy), тогда не беспокойтесь о дальнейших действиях;

  2. если в URL-адресе содержится «www» или он не содержит префикса города, то давайте двигаться дальше, когда нам нужно исправить ситуацию;

  3. если у них есть файл cookie (StoreLocationID), в котором указан их предпочитаемый город, перенаправьте его в / Home / ChooseCity, где мы установим другие файлы cookie, и перенаправим на правильный URL-адрес: nyc.acme.com или la.acme. ком.

  4. если они вошли в систему и если в их учетной записи указан предпочтительный город, используйте его (перенаправить на / Home / ChooseCity - то же, что 3 выше)

  5. у них нет файлов cookie и они не сохраняются в учетной записи пользователя, поэтому используйте их IP-адрес, чтобы получить почтовый индекс и посмотреть, находится ли этот почтовый индекс в городе или вокруг нас, если так, отправьте его в / Home / ChooseCity, как в 3 и 4 выше

  6. наконец, если мы не можем определить, какой город они предпочитают, мы можем выбрать их вручную в / Home / ChooseLocation /

Это все работает . НО, мы начинаем замечать следующее в случайное время ...

Иногда (и без видимого шаблона) пользователь щелкает ссылку и в итоге попадает на совершенно случайную страницу (а не место назначения по нажатой ссылке). Может показаться, что местоположение, в котором они оказываются, обычно является местоположением, которое, возможно, запрашивал другой пользователь (за исключением городов) (я знаю, что вы думаете о квантовой запутанности, но я исключил это). Как будто IIS запутывается из-за того, кого за что спрашивают.

Мой вопрос (после всего этого) заключается в том, может ли приведенная выше логика (в OnActionExecuted) вызывать отключение IIS? Следует отметить, что проблема «случайных расположений» возникает даже у пользователей с nyc или la в URL-адресе ... пользователей, которые имеют надлежащий cookie-файл для хранения. Это означает, что пользователь никогда не должен перенаправляться на «/ Home / ChooseCity» или «/ Home / ChooseLocation», так как они имеют правильную конфигурацию URL и файлов cookie.

1 Ответ

0 голосов
/ 19 февраля 2011

Окончательный ответ на этот вопрос заключается в том, что я использовал статические классы / свойства в местах, где это было неуместно. Я не понимал, что такие статические классы были общими для всего веб-приложения (то есть для всех пользователей). Я предположил, что они содержались по одному пользователю за раз.

Странное поведение было результатом состояния гонки на общих свойствах.

...