in src/WebJobs.Extensions.Http/HttpTriggerAttributeBindingProvider.cs [380:432]
private async Task<IValueProvider> CreateUserTypeValueProvider(HttpRequest request, string invokeString)
{
// First check to see if the WebHook data has already been deserialized,
// otherwise read from the request body if present
if (!request.HttpContext.Items.TryGetValue(HttpExtensionConstants.AzureWebJobsWebHookDataKey, out object value))
{
if (IsRequestPayloadReadable(request))
{
IServiceProvider requestServices = request.HttpContext.RequestServices;
var metadata = requestServices
.GetService<ModelBinding.IModelMetadataProvider>()?
.GetMetadataForType(_parameter.ParameterType);
if (metadata != null)
{
var mvcOptions = requestServices.GetService<IOptions<MvcOptions>>()?.Value;
var streamReaderFactory = requestServices.GetService<IHttpRequestStreamReaderFactory>();
Func<Stream, Encoding, TextReader> readerFactory = null;
if (streamReaderFactory != null)
{
readerFactory = streamReaderFactory.CreateReader;
}
else
{
readerFactory = (s, e) => new HttpRequestStreamReader(s, e);
}
var context = new InputFormatterContext(request.HttpContext,
modelName: string.Empty,
modelState: new ModelBinding.ModelStateDictionary(),
metadata: metadata,
readerFactory: readerFactory);
var formatter = mvcOptions.InputFormatters.FirstOrDefault(f => f.CanRead(context));
if (formatter != null)
{
var result = await formatter.ReadAsync(context);
value = result.Model;
}
}
}
}
if (value == null)
{
value = Activator.CreateInstance(_parameter.ParameterType);
}
return new SimpleValueProvider(_parameter.ParameterType, value, invokeString);
}