在执行Response.Redirect(Request.RawUrl)时,此网页有一个重定向循环

时间:2015-11-10 18:59:23

标签: c#

我搜索了here和其他网页,但我没有找到问题的答案。

我尝试实现的目标是,如果用户在国家/地区A和国家/地区B之间切换,语言会切换但不会将其返回主页,而是将其重定向到同一页面他们在(使用更新的语言)。但是,对我来说棘手的部分是,如果用户在国家/地区A和国家CD或其他任何内容之间切换,我们想要返回它们到主页。因此,如果他们在AB之间切换,我想要重定向到同一页面。 (我的语言切换工作正常,我只是在不同情况下遇到重定向问题。)

我的方法如下:

        [HttpGet]
        public ActionResult SetLanguage(string languageId)
        {

        var currentCulture = GetCurrentCulture(); //Gets the current language for a user

        if ((currentCulture == "A" || currentCulture == "B") 
             && (languageId == "A" || language == "B"))
        {
            // Set culture to use chosen language/culture
            CultureService.SaveCulture(HttpContext.Response, languageId);
            Response.Redirect(Request.RawUrl);
        }
        else 
        {   
            CultureModule.SavePreferredCulture(HttpContext.Response, languageCode);
        }        
        return RedirectToAction("Index", "Home", new { culture = languageId });
    }

这导致Chrome中出现此错误:

  

此网页有重定向循环

在调试时出现我的自我无限循环,但我不明白为什么/如何或如何解决这个问题。

以下是我尝试更改的内容:Response.Redirect(Request.RawUrl);尝试和return,但这不起作用,所以我尝试使用其他Redirect RedirectPermanent等选项。我没有任何运气,而且已经有一段时间了,因为我不得不玩这样的事情,所以我不知道我在这里做了些什么&#39我做错了。

我相信我需要一个return代替Response.Redirect(Request.RawUrl);,但我已经尝试过使用上面的内容了,而且我无法完成任何事情。< / p>

如果您需要任何其他代码或其他详细信息,请告知我们,我会更新帖子。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

此错误(浏览器出现客户端错误)意味着您将无限重定向到同一页面。

我认为您要检查重定向到同一页面的是:

if((currentCulture == "A" && languageId == "B") || (currentCulture == "B" && languageId == "A"))

您可以尝试使用Request.Url.AbsolutePath来避免在重定向期间再次传递查询字符串。 Request.RawUrl包含查询字符串,并且可能在其中传递languageId。

答案 1 :(得分:0)

不要理会这种方法。编辑路线配置并将语言添加到路线中。使控制器继承自新的基本控制器。覆盖基础控制器中的on begin execute。在那里读取您的路线值并设置文化。

答案 2 :(得分:0)

我最后通过在URL上做一些诡计来解决这个问题。

TLDR:我使用Request.UrlReferrer.Authority抓取了网址,并使用string.Replace("A","B")替换了网址中的语言代码。

如果正常网址是这样的:

  

http://localhost:0000/EN/Product/Shirt

我希望实现重定向到同一页面但不是EN我想要FR或用户设置的任何语言。

所以新网址需要如下所示:

  

http://localhost:0000/FR/Product/Shirt

为此,我做到了这一点:

if ((currentCulture == "A" || currentCulture == "B") && (languageId == "A" || language == "B"))
{
                var urlReferrer = this.Request.UrlReferrer;
                if (urlReferrer != null)
                {
                    var currentUrl = urlReferrer.PathAndQuery;
                    var url = "https://" + Request.UrlReferrer.Authority;

                    if ((currentCultureUI == A) && (languageCode == B))
                    {
                        var aToBPathAndQuery = currentUrl.Replace("A", "B");

                        return Redirect(url + aToBPathAndQuery);
                    }

                var bToAPathAndQuery = usersCurrentUrl.Replace("B", "A");

                return Redirect(url + bToAPathAndQuery);

}

AB都是资源文件中包含的字符串,因此我将其更改为在问题和答案中节省空间并使事情变得更简单。现在,如果这些值发生了变化,它们可以在资源文件中更改一次,并且它们很适合。可以将它们换成A = "English"B = "Spanish"

之类的内容