【问题标题】:Invalid non-ASCII or control character in header on redirect重定向时标头中的非 ASCII 或控制字符无效
【发布时间】:2019-07-25 12:36:05
【问题描述】:

我使用的是 asp.net core 2.1,但我在重定向时遇到了问题。 我的网址是这样的:

HTTP://localhost:60695/ShowProduct/2/شال-آبی

最后一个参数是波斯语。 它抛出以下错误:

InvalidOperationException: Invalid non-ASCII or control character in header: 0x0634

但是当我更改英文的最后一个参数时:

HTTP://localhost:60695/ShowProduct/2/scarf-blue

它工作正常,一切正常。 我正在使用以下代码进行重定向:

[HttpPost]
[Route("Login")]
public IActionResult Login(LoginViewModel login, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View(login);
    }        
    //SignIn Codes is hidden
    if (Url.IsLocalUrl(returnUrl) && !string.IsNullOrEmpty(returnUrl))
    {                
        return Redirect(returnUrl);
    }
    if (permissionService.CheckUserIsInRole(user.UserId, "Admin"))
    {
        return Redirect("/Admin/Dashboard");
    }
    ViewBag.IsSuccess = true;
    return View();
}

我该如何解决这个问题?

【问题讨论】:

    标签: asp.net-core model-view-controller .net-core


    【解决方案1】:

    一般来说,是Redirect(returnUrl)引起的。
    这个方法会返回一个RedirectResult(url),最后将Response.Headers["Location"]设置为below

    Response.Headers[HeaderNames.Location] = returnUrl;
    

    但 HTTP 的 Headers 不接受 非 ASCII 字符。

    已经有一些问题(#2678#4919)建议默认对 URL 进行编码。
    但是还没有这样的开箱即用功能。

    快速解决您的问题:

    var host= "http://localhost:60695";
    var path = "/ShowProduct/2/شال-آبی";
    path=String.Join(
        "/",
        path.Split("/").Select(s => System.Net.WebUtility.UrlEncode(s))
    );
    return Redirect(host+path);
    

    【讨论】:

      【解决方案2】:

      另一个更简单的选择(对我有用):

          var uri = new Uri(urlStr);
          return Redirect(uri.AbsoluteUri);
      

      【讨论】:

      • upvoted- 有效且简单。我将用调用此代码的方法替换 Redirect()。我不敢相信这不是默认完成的。
      • 一个警告 - 如果我们使用相对路径进行重定向,我怀疑这种方法会失败,就像原始帖子显示的那样。
      【解决方案3】:

      我用Flurl

      var encoded = Flurl.Url.EncodeIllegalCharacters(url);
      return base.Redirect(encoded);
      

      这适用于绝对和相对 URL。

      【讨论】:

        猜你喜欢
        • 2018-04-20
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 2019-04-29
        • 2013-01-29
        • 1970-01-01
        • 2016-10-05
        • 2021-04-01
        相关资源
        最近更新 更多