public Task <ITriggerBinding> TryCreateAsync(TriggerBindingProviderContext context) { if (context == null) { throw new ArgumentNullException("context"); } ParameterInfo parameter = context.Parameter; HttpTriggerAttribute attribute = parameter.GetCustomAttribute <HttpTriggerAttribute>(inherit: false); if (attribute == null) { return(Task.FromResult <ITriggerBinding>(null)); } // Can bind to user types, HttpRequestMessage, object (for dynamic binding support) and all the Read // Types supported by StreamValueBinder IEnumerable <Type> supportedTypes = StreamValueBinder.GetSupportedTypes(FileAccess.Read) .Union(new Type[] { typeof(HttpRequestMessage), typeof(object) }); bool isSupportedTypeBinding = ValueBinder.MatchParameterType(parameter, supportedTypes); bool isUserTypeBinding = !isSupportedTypeBinding && Utility.IsValidUserType(parameter.ParameterType); if (!isSupportedTypeBinding && !isUserTypeBinding) { throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Can't bind HttpTriggerAttribute to type '{0}'.", parameter.ParameterType)); } return(Task.FromResult <ITriggerBinding>(new HttpTriggerBinding(attribute, context.Parameter, isUserTypeBinding))); }
public HttpTriggerBinding(HttpTriggerAttribute attribute, ParameterInfo parameter, bool isUserTypeBinding) { _parameter = parameter; _isUserTypeBinding = isUserTypeBinding; Dictionary <string, Type> aggregateDataContract = new Dictionary <string, Type>(StringComparer.OrdinalIgnoreCase); if (_isUserTypeBinding) { // Create the BindingDataProvider from the user Type. The BindingDataProvider // is used to define the binding parameters that the binding exposes to other // bindings (i.e. the properties of the POCO can be bound to by other bindings). // It is also used to extract the binding data from an instance of the Type. _bindingDataProvider = BindingDataProvider.FromType(parameter.ParameterType); if (_bindingDataProvider.Contract != null) { aggregateDataContract.AddRange(_bindingDataProvider.Contract); } } // add any route parameters to the contract if (!string.IsNullOrEmpty(attribute.RouteTemplate)) { var routeParameters = _httpRouteFactory.GetRouteParameters(attribute.RouteTemplate); var parameters = ((MethodInfo)parameter.Member).GetParameters().ToDictionary(p => p.Name, p => p.ParameterType, StringComparer.OrdinalIgnoreCase); foreach (string parameterName in routeParameters) { // don't override if the contract already includes a name if (!aggregateDataContract.ContainsKey(parameterName)) { // if there is a method parameter mapped to this parameter // derive the Type from that Type type; if (!parameters.TryGetValue(parameterName, out type)) { type = typeof(string); } aggregateDataContract[parameterName] = type; } } } _bindingDataContract = aggregateDataContract; }
public HttpTriggerBinding(HttpTriggerAttribute attribute, ParameterInfo parameter, bool isUserTypeBinding) { _parameter = parameter; _isUserTypeBinding = isUserTypeBinding; Dictionary<string, Type> aggregateDataContract = new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase); if (_isUserTypeBinding) { // Create the BindingDataProvider from the user Type. The BindingDataProvider // is used to define the binding parameters that the binding exposes to other // bindings (i.e. the properties of the POCO can be bound to by other bindings). // It is also used to extract the binding data from an instance of the Type. _bindingDataProvider = BindingDataProvider.FromType(parameter.ParameterType); if (_bindingDataProvider.Contract != null) { aggregateDataContract.AddRange(_bindingDataProvider.Contract); } } // add any route parameters to the contract if (!string.IsNullOrEmpty(attribute.RouteTemplate)) { var routeParameters = _httpRouteFactory.GetRouteParameters(attribute.RouteTemplate); var parameters = ((MethodInfo)parameter.Member).GetParameters().ToDictionary(p => p.Name, p => p.ParameterType, StringComparer.OrdinalIgnoreCase); foreach (string parameterName in routeParameters) { // don't override if the contract already includes a name if (!aggregateDataContract.ContainsKey(parameterName)) { // if there is a method parameter mapped to this parameter // derive the Type from that Type type; if (!parameters.TryGetValue(parameterName, out type)) { type = typeof(string); } aggregateDataContract[parameterName] = type; } } } _bindingDataContract = aggregateDataContract; }
public override Collection <Attribute> GetAttributes() { var authLevel = Context.GetMetadataEnumValue <AuthorizationLevel>("authLevel", AuthorizationLevel.Function); JArray methodArray = Context.GetMetadataValue <JArray>("methods"); string[] methods = null; if (methodArray != null) { methods = methodArray.Select(p => p.Value <string>()).ToArray(); } var attribute = new HttpTriggerAttribute(authLevel, methods) { Route = Context.GetMetadataValue <string>("route") }; return(new Collection <Attribute> { attribute }); }