Если вы сами генерируете тело запроса:
В идеале вы должны сгенерировать полезные данные JSON тела запроса путем сериализации существующего класса DTO.
Если вы не можете этого сделать, то вам следует безопасно экранировать строковые значения для использования в JSON с прямым рендерингом, используя встроенные в JavaScript служебные методы *1040* строкового экранирования:
- В полном профиле. NET Framework (а не NET Core, NET Standard или. NET Framework Client Profile) вы можете использовать
System.Web.HttpUtility.JavaScriptStringEncode
. - В противном случае используйте
System.Text.Encodings.Web.JavaScriptEncoder
.
Если вы получаете неверный ввод, который вы не можете контролировать:
Подход 1: Работайте с телом запроса напрямую:
Это простейший подход, но он требует, чтобы вы выполняли его для каждого действия контроллера, которое получает неверный формат. JSON:
public async Task<IHttpActionResult> SignUp()
{
String requestBody;
using( StreamReader rdr = new StreamReader( this.Request.Body ) )
{
requestBody = await rdr.ReadToEndAsync();
}
//
// Tweak the raw JSON text to make it parseable:
String requestBodyTweaked = requestBody.Replace( "\\\",", "\"," );
// Parse it and pass it on to the original `SignUp` method:
AuthInput dto = JsonConvert.DeserializeObject<AuthInput>( requestBodyTweaked );
return this.SignUp( dto );
}
// This is your current SignUp action method, it's unchanged except it's now `private`:
private IHttpActionResult SignUp( AuthInput input)
{
}
Подход 2: ПО промежуточного слоя для перехвата и изменения всех тел запроса:
Вы можете смягчить это, используя промежуточный уровень, который в перехватывает тело запроса, но будьте очень осторожны.
См. этот QA для получения инструкций о том, как перехватить и изменить тело входящего запроса: ASP NET Ядро изменяет / заменяет тело запроса
Я предполагаю, что вы хотите отредактировать необработанный JSON текст, а не анализировать его: