Я использую asp.net core 2.1, и у меня проблема с перенаправлением. Мой URL-адрес выглядит так:
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).
Этот метод вернет RedirectResult(url) и, наконец, установит Response.Headers["Location"] как ниже:
Response.Headers[HeaderNames.Location] = returnUrl;
Но Headers HTTP не принимает символы не-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);
Другой более простой вариант (работает для меня):
var uri = new Uri(urlStr);
return Redirect(uri.AbsoluteUri);
Я использую вихрь
var encoded = Flurl.Url.EncodeIllegalCharacters(url);
return base.Redirect(encoded);
Это хорошо работает для абсолютных и относительных URL-адресов.