Asp.net-Core

重定向時標頭中的非 ASCII 或控製字元無效

  • February 17, 2021

我正在使用 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();
}

我該如何解決這個問題?

一般而言,它是由Redirect(returnUrl). 此方法
將返回 aRedirectResult(url)並最終設置Response.Headers["Location"]如下

Response.Headers[HeaderNames.Location] = returnUrl;

但是HeadersHTTP 不接受非 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);

引用自:https://stackoverflow.com/questions/54979168