. NET ApiController: Пользовательское поведение привязки модели с использованием [FromBody] T - PullRequest
0 голосов
/ 05 мая 2020

Я использую следующий код для десериализации экземпляра MyModel

      public async Task<IHttpActionResult> DoSomething([FromBody] MyModel model)

class MyModel {
string a;
int b;
}

Есть ли необходимость в более строгой привязке модели, чтобы следующий ввод не работал?

{
"a":"someString",
"b": 4,
"c": "somethingIWantToCauseAnErrorWhenPresent"
}

1 Ответ

1 голос
/ 06 мая 2020

Вы можете написать свой собственный ActionFilter для поиска тела запроса и на основе вашего logi c выбросить исключение

public class CustomValidationFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            var bodyLength = context.HttpContext.Request.Body.Length;

            var buffer = new byte[bodyLength];
            context.HttpContext.Request.EnableRewind();
            context.HttpContext.Request.Body.Position = 0;
            var streamReader = new StreamReader(context.HttpContext.Request.Body);//do not dispose this streamReader
            var requestBody = streamReader.ReadToEnd();

            var jsonBody = JsonConvert.DeserializeObject<JObject>(requestBody);

            if (jsonBody.Property("c") != null) // your custom validation
            {

            }

        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
        }
    }

Либо вы примените этот фильтр глобально, во всем API, как это (. net ядро ​​2.2):

            services.AddMvc(options => options.Filters.Add(typeof(CustomValidationFilter))).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

или наследовать от класса Attribute и поместить его в определенное действие / контроллер

...