Как выполнить привязку к модели веб-API, когда тело запроса включает escape-символы? - PullRequest
0 голосов
/ 07 августа 2020

У меня есть конечная точка, которая выглядит так:

public IHttpActionResult SignUp([FromBody] AuthInput input)

Каждый раз, когда тело запроса включает escape-символ «\», API не может привязать данные к модели. Я предполагаю, что это связано с тем, что JSON будет считаться «некорректным».

Я хотел бы отформатировать тело запроса, прежде чем API попытается привязать его к модели и изменить все «\» в "\\"

Тело запроса

{
   "email": "mrsmith@usa.com",
   "password": "badpassword\",
   "firstName": "John",
   "lastName": "Smith"
}

Возврат делает входной объект «нулевым»

Использование c# ASP . NET 4.6.2

1 Ответ

0 голосов
/ 07 августа 2020

Если вы сами генерируете тело запроса:

  • В идеале вы должны сгенерировать полезные данные 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 текст, а не анализировать его:

...