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

本文关键字:RawUrl 有一个 循环 重定向 Request 网页 执行 Response RRedirect | 更新日期: 2023-09-27 18:21:20

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

我试图实现的是,如果用户在国家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和其他选项。我在这方面运气不好,我已经有一段时间没有玩过这样的游戏了,所以我在这里对自己做错的事情感到不知所措。

我相信我需要一个return来代替Response.Redirect(Request.RawUrl);,但我试过玩上面的东西,但我什么都做不到。

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

谢谢你的帮助!

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

这个错误(浏览器的客户端错误)意味着你会无限地重定向到同一个页面。

我认为你试图检查重定向到同一页面的是:

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

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

不要使用这种方法。编辑路由配置并将语言添加到路由中。使您的控制器继承自新的基本控制器。在基本控制器中重写开始执行时的。在那里阅读你的路线价值并设定文化。

我最终通过对URL进行一些欺骗来解决这个问题。

TLDR:我使用Request.UrlReferrer.Authority获取URL,并使用string.Replace("A","B")交换URL中的语言代码。

如果正常的url是这样的:

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

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

因此,新的URL需要看起来像这样:

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"