Невозможно использовать вьетнамские/подписанные и пробельные символы в параметрах URL-адреса в Blazor

Я использую blazor с .net core 3.0 для разработки веб-сайта, который позволяет передавать некоторые параметры в URL-адресе.

Проблема заключается в том, что всякий раз, когда я передаю вьетнамское ключевое слово в URL-адресе, blazor создает внутреннее исключение, которое появляется в консоли браузера.

Имейте в виду, что я не могу использовать Encode URL для извлечения этой информации, поскольку blazor сам создает исключения перед вызовом OnAfterRenderAsync

Работа

https://localhost:44316/?keyword=tieng viet
https://localhost:44316/?keyword=tieng%20viet

Не работает

https://localhost:44316/?keyword=tiếng việt
https://localhost:44316/?keyword=tiếng%20việt
https://localhost:44316/?keyword=ti%E1%BA%BFng%20vi%E1%BB%87t

Как воспроизвести:

  • Просто создайте совершенно новый проект blazor с .net core 3.0.
  • Затем запустите проект и попробуйте с этими URL-адресами.

=> Поскольку я не добавляю сюда дополнительный код, blazor не должен создавать никаких исключений

Вот исключение: Вот исключение

Спасибо за помощь!


person Hieu Le    schedule 04.11.2019    source источник
comment
Отвечает ли это на ваш вопрос? Кодирование и декодирование URL-адресов в ASP.NET Core   -  person mjwills    schedule 04.11.2019
comment
@mjwills Я так не думаю, поскольку blazor по умолчанию должен отлично справляться с любыми параметрами. Мы можем расшифровать значения параметров позже, все в порядке. Проблема в том, что blazor сам генерирует исключения   -  person Hieu Le    schedule 04.11.2019
comment
Шаг 1, blazor не должен кидать исключения, шаг 2 мы можем декодировать параметры и получить то, что нам нужно.   -  person Hieu Le    schedule 04.11.2019
comment
Будет ли это работать, если вы используете предложенный мной URL?   -  person mjwills    schedule 04.11.2019
comment
@mjwills нет, это не так. Также генерировать исключения   -  person Hieu Le    schedule 04.11.2019
comment
Закинуто в visual studio. Он отображается в консоли браузера как вложение, которое я добавил, говоря, что предоставленные uris недействительны.   -  person Hieu Le    schedule 04.11.2019
comment
localhost:44316/?keyword=ti%E1 %BA%BFng+vi%E1%BB%87t работает?   -  person mjwills    schedule 04.11.2019
comment
@mjwills, извини, парень, твое предложение работает нормально. Я неправильно проверил. Благодарю вас!   -  person Hieu Le    schedule 05.11.2019
comment
Может быть, я проверял с кодировкой процентов, а не + один   -  person Hieu Le    schedule 05.11.2019
comment
Честно говоря, %20 должен работать. Это совершенно законно.   -  person mjwills    schedule 05.11.2019
comment
Да, это странно. Я использую QueryHelpers.AddQueryString для создания URL-адреса. Это дает мне% 20 единиц, а не +. Итак, с этого момента я должен кодировать и декодировать каждый раз   -  person Hieu Le    schedule 05.11.2019


Ответы (2)


Я должен кодировать и декодировать каждый раз

Не уверен, что это ошибка. Однако вам не нужно кодировать и декодировать каждый раз. В качестве обходного пути мы можем создать быстрое и грязное исправление, чтобы space в строке запроса было преобразовано в +.

Поскольку эта ошибка возникает при вызове удаленного signalR ComponentHub::StartCircuit(), мы можем заменить местоположение до того, как оно будет передано в siganlR. Основываясь на комментарии @mjwills выше, в котором предлагается localhost:44316/?keyword=ti%E1%BA%BFng+vi%E1%BB%87t, вы можете добавить script в свой _Host.cshtml, как показано ниже:

<script>
    !function(){
        var raw = new URL(window.location.href);
        raw.search = raw.search.replace("%20","+");    // replace the `%20` with "+"
        window.history.replaceState('', document.title, raw);
    }();
</script>
<script src="_framework/blazor.server.js"></script>

Таким образом, ваш код на стороне сервера не должен заботиться о кодировке.

person itminus    schedule 05.11.2019
comment
Твоя идея работает, бро. Я сделал навигацию в OnInitializedAsync, если URL-адрес содержит% 20, однако он работает только для ServerPrerendered, а не для других. - person Hieu Le; 06.11.2019

Перво-наперво: ничего особенного в Blazor

Вы просто используете недопустимый URI. Каждый символ, используемый в URI, должен иметь соответствующие символы в таблице US-ASCII.

Blazor просто вызывает Uri.IsWellFormedUriString, который возвращает false для вашего примера.

Как указывали другие, решение состоит в том, чтобы закодировать URL-адрес. Это необходимо сделать до, когда этот URL-адрес будет использоваться для перехода на страницу blazor.

person Postlagerkarte    schedule 04.11.2019
comment
Я думал так же, но попробовал шаги воспроизведения OP и обнаружил, что в то время как localhost:44316/?keyword=ti%E1%BA%BFng+vi%E1%BB%87t работает, localhost:44316/?keyword=ti%E1%BA%BFng%20vi%E1%BB%87t не (и последний определенно является действительным URL) - person mjwills; 04.11.2019
comment
Я верю вашему утверждению, что это вызвано Uri.IsWellFormedUriString. Что меня смутило, так это то, что при вставке https://localhost:44316/?keyword=tiếng việt в хром он будет закодирован в keyword=tiếng%20việt вместо keyword=tiếng+việt. Согласно этому thread кажется, что %20 следует рассматривать как действительный URL-адрес? - person itminus; 04.11.2019
comment
@mjwills извините всех. Прочитав ваши комментарии еще раз. Я пытался. Оно работает! - person Hieu Le; 05.11.2019
comment
Итак, в основном, как вы упомянули, я не понимаю, почему символ пробела преобразуется в% 20, а не + - person Hieu Le; 05.11.2019