Как мне передать строку Base64 контроллеру MVC

#asp.net-mvc

#asp.net-mvc

Вопрос:

У меня есть служба, в которой я пытаюсь передать зашифрованное значение на мой сайт MVC, в частности на домашний контроллер. Значение отправляется как Base64, и я могу проверить правильность строки Base64 при создании URI из службы. Но когда запрос поступает на мой сайт и обрабатывается моим контроллером, все значение вводится в нижний регистр, что приводит к сбою дешифрования, поскольку Base64 чувствителен к регистру. Я пробовал кодировать строку в процентах, надеясь сохранить оболочку, но это просто возвращает значение 404.

Мой маршрут выглядит так:

 routes.MapRoute("ResultsReady", "Results-Ready/{sn}", new { controller = "Home", action = "ResultsReady", sn = UrlParameter.Optional });
 

Мой контроллер выглядит так:

 public ActionResult ResultsReady(string sn)
{
    return Content(sn);
}
 

И мой сервисный код строит URI следующим образом:

 using (var client = new HttpClient()) 
{
    string base64EncodedValue = SomeFunc();
    var response = client.GetAsync($"https://somewhere.com/Results-Ready/{base64EncodedValue}").Resu<
}
 

Комментарии:

1. Это должна быть строка запроса или параметр формы, а не путь.

2. BASE64 не является алгоритмом шифрования. Если вы хотите отправить данные, используйте POST, а не GET со странным URL. Если вы хотите указать параметры в URL-адресе, используйте параметры запроса, а не путь. Вы не опубликовали никакого кода, который декодирует BASE64 или пример результата, поэтому даже не догадываетесь, на что вы ссылаетесь под строчной строкой BASE64? Результат декодирования в нижнем регистре? Используете ли вы Convert.FromBase64String или код, созданный вручную?

3. Что вы пытаетесь сделать и почему? Если вам нужно шифрование, используйте HTTPS. Вот и все. The ASP.NET Основные шаблоны используют HTTPS по умолчанию, вы должны явно отключить его. Все распознают BASE64, поэтому использование его в незашифрованном URL-адресе ничего не защитит. Фактически, прокси-серверы и инструменты отладки, такие как Fiddler, могут декодировать его автоматически

Ответ №1:

В итоге я использовал Post вместо Get, и это работает.

Что касается вопросов, касающихся показа большего количества кода, то конкретика всегда была неуместна. Дело в том, что метод someFunc возвращает строку base64, точка! И когда я передаю эту строку в качестве параметра, передаваемого по URL, контроллер веб-сайта всегда принимал переданный параметр и делал все это в нижнем регистре. Любой, кто понимает base64, может увидеть проблему с потерей точной строки с учетом регистра.

Ответ №2:

Используя вызов ajax, вы можете отправить объект FormData.

 var file = document.getElementById("base64string").src;

var formdata = new FormData();
formdata.append("base64string", file);

$.ajax({
    url: "@Url.Action("SaveImage")",
    type: "POST",
    data: formdata,
    processData: false,
    contentType: false
});
 

и в контроллере:

 [HttpPost]
public void SaveImage(string base64string)
{
   ...
}
 

Комментарии:

1. Это не вопрос о Javascript или о том, как публиковать данные. То, что вы опубликовали, — это jQuery, а не AJAX (это просто аббревиатура, указывающая технологии), и оно также не требуется. Все браузеры поддерживают fetch изначально

2. На самом деле, вопрос в том, почему код контроллера не может правильно декодировать строку. Хотя вопрос не содержит никакого соответствующего кода, поэтому мы понятия не имеем, в чем проблема