public async Task BindModelAsync(ModelBindingContext bindingContext)
        {
            var httpContext     = bindingContext.HttpContext;
            var modelBindingKey = bindingContext.IsTopLevelObject
                ? bindingContext.BinderModelName ?? string.Empty
                : bindingContext.ModelName;

            var formatterContext = new InputFormatterContext(
                httpContext, modelBindingKey,
                bindingContext.ModelState,
                bindingContext.ModelMetadata,
                _readerFactory, true);

            try
            {
                var result = await _input.ReadAsync(formatterContext);

                if (result.HasError)
                {
                    return;
                }

                if (result.IsModelSet)
                {
                    var model = result.Model;
                    bindingContext.Result = ModelBindingResult.Success(model);
                }
                else
                {
                    var message = bindingContext
                                  .ModelMetadata
                                  .ModelBindingMessageProvider
                                  .MissingRequestBodyRequiredValueAccessor();
                    bindingContext.ModelState.AddModelError(modelBindingKey, message);
                }
            }
            catch (Exception exception)
                when(exception is InputFormatterException || ShouldHandleException(_input))
                {
                    bindingContext.ModelState.AddModelError(modelBindingKey,
                                                            exception, bindingContext.ModelMetadata);
                }
        }