簡體   English   中英

重寫OnActionExecuted和獲取怪異的IIS響應

[英]Overriding OnActionExecuted and Getting Weird IIS Responses

所以,

我在IIS 6上有一個MVC 2站點(通配符應用程序maps / aspnet_isapi.dll hack),在該站點上我們希望根據人們的首選位置將人們定向到不同的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. 如果網址包含“ www”或不包含城市前綴,那么請繼續進行處理,以解決問題;

  3. 如果他們有指定其首選城市的cookie(StoreLocationID),則重定向到/ Home / ChooseCity,我們將在其中設置其他cookie並重定向到正確的URL:nyc.acme.com或la.acme.com。

  4. 如果他們已登錄,並且其用戶帳戶列出了首選城市,則使用該城市(重定向到/ Home / ChooseCity-與上述3相同)

  5. 他們沒有Cookie,也沒有存儲在用戶帳戶中,因此請使用其IP獲取郵政編碼,並查看該郵政編碼是否在我們覆蓋的城市之內或附近,如果是的話,請按照上述3和4的說明發送至/ Home / ChooseCity

  6. 最后,如果我們無法確定他們想要的城市,請讓他們在/ Home / ChooseLocation /

這一切有效 但是,我們開始在隨機時間注意到以下情況...

有時(沒有看上去的樣式),用戶將單擊一個鏈接並最終到達一個完全隨機的頁面(而不是單擊的鏈接的目標)。 他們最終到達的位置似乎通常是另一個用戶(相隔兩個城市)可能正在請求的位置(我知道您正在考慮量子糾纏,但我已經排除了這一點)。 好像IIS對於誰要求什么感到困惑。

我的問題(畢竟)是上面的邏輯(在OnActionExecuted )是否會導致IIS跳閘? 應當注意的是,即使對於URL中帶有nyc或la的用戶,也會出現“隨機位置”問題……具有適當存儲位置cookie的用戶。 這意味着永遠不要將用戶重定向到“ / Home / ChooseCity”或“ / Home / ChooseLocation”,因為它們具有正確的URL和cookie配置。

對此的最終答案是,我在不合適的地方使用了靜態類/屬性。 我不明白這種靜態類是在整個Web應用程序(意味着所有用戶)之間共享的。 我假設它們一次只包含一個用戶。

怪異的行為是共享屬性上競爭條件的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM