public virtual bool TryCreate(FunctionMetadata functionMetadata, out FunctionDescriptor functionDescriptor) { if (functionMetadata == null) { throw new InvalidOperationException("functionMetadata"); } functionDescriptor = null; // Default the trigger binding name if a name hasn't // been specified // TODO: Remove this logic and always require it to be explicitly // specified? foreach (var binding in functionMetadata.Bindings.Where(p => p.IsTrigger)) { if (string.IsNullOrEmpty(binding.Name)) { if (binding.Type == BindingType.HttpTrigger) { binding.Name = DefaultHttpInputParameterName; } else { binding.Name = DefaultInputParameterName; } } } // parse the bindings Collection <FunctionBinding> inputBindings = FunctionBinding.GetBindings(Config, functionMetadata.InputBindings, FileAccess.Read); Collection <FunctionBinding> outputBindings = FunctionBinding.GetBindings(Config, functionMetadata.OutputBindings, FileAccess.Write); BindingMetadata triggerMetadata = functionMetadata.InputBindings.FirstOrDefault(p => p.IsTrigger); string scriptFilePath = Path.Combine(Config.RootScriptPath, functionMetadata.ScriptFile); IFunctionInvoker invoker = null; try { invoker = CreateFunctionInvoker(scriptFilePath, triggerMetadata, functionMetadata, inputBindings, outputBindings); Collection <CustomAttributeBuilder> methodAttributes = new Collection <CustomAttributeBuilder>(); Collection <ParameterDescriptor> parameters = GetFunctionParameters(invoker, functionMetadata, triggerMetadata, methodAttributes, inputBindings, outputBindings); functionDescriptor = new FunctionDescriptor(functionMetadata.Name, invoker, functionMetadata, parameters, methodAttributes); return(true); } catch (Exception) { IDisposable disposableInvoker = invoker as IDisposable; if (disposableInvoker != null) { disposableInvoker.Dispose(); } throw; } }
public virtual bool TryCreate(FunctionMetadata functionMetadata, out FunctionDescriptor functionDescriptor) { if (functionMetadata == null) { throw new InvalidOperationException("functionMetadata"); } ValidateFunction(functionMetadata); // parse the bindings Collection <FunctionBinding> inputBindings = FunctionBinding.GetBindings(Config, BindingProviders, functionMetadata.InputBindings, FileAccess.Read); Collection <FunctionBinding> outputBindings = FunctionBinding.GetBindings(Config, BindingProviders, functionMetadata.OutputBindings, FileAccess.Write); VerifyResolvedBindings(functionMetadata, inputBindings, outputBindings); BindingMetadata triggerMetadata = functionMetadata.InputBindings.FirstOrDefault(p => p.IsTrigger); string scriptFilePath = Path.Combine(Config.RootScriptPath, functionMetadata.ScriptFile ?? string.Empty); functionDescriptor = null; IFunctionInvoker invoker = null; try { invoker = CreateFunctionInvoker(scriptFilePath, triggerMetadata, functionMetadata, inputBindings, outputBindings); Collection <CustomAttributeBuilder> methodAttributes = new Collection <CustomAttributeBuilder>(); Collection <ParameterDescriptor> parameters = GetFunctionParameters(invoker, functionMetadata, triggerMetadata, methodAttributes, inputBindings, outputBindings); functionDescriptor = new FunctionDescriptor(functionMetadata.Name, invoker, functionMetadata, parameters, methodAttributes, inputBindings, outputBindings); return(true); } catch (Exception ex) { Host.Logger.LogTrace(ex, $"Creating function descriptor for function {functionMetadata.Name} failed"); IDisposable disposableInvoker = invoker as IDisposable; if (disposableInvoker != null) { disposableInvoker.Dispose(); } throw; } }
public virtual bool TryCreate(FunctionMetadata functionMetadata, out FunctionDescriptor functionDescriptor) { functionDescriptor = null; if (functionMetadata.IsDisabled) { return(false); } // parse the bindings Collection <FunctionBinding> inputBindings = FunctionBinding.GetBindings(Config, functionMetadata.InputBindings, FileAccess.Read); Collection <FunctionBinding> outputBindings = FunctionBinding.GetBindings(Config, functionMetadata.OutputBindings, FileAccess.Write); BindingMetadata triggerMetadata = functionMetadata.InputBindings.FirstOrDefault(p => p.IsTrigger); BindingType triggerType = triggerMetadata.Type; string triggerParameterName = triggerMetadata.Name; bool triggerNameSpecified = true; if (string.IsNullOrEmpty(triggerParameterName)) { // default the name to simply 'input' triggerMetadata.Name = triggerParameterName = "input"; triggerNameSpecified = false; } Collection <CustomAttributeBuilder> methodAttributes = new Collection <CustomAttributeBuilder>(); ParameterDescriptor triggerParameter = null; bool omitInputParameter = false; switch (triggerType) { case BindingType.QueueTrigger: triggerParameter = ParseQueueTrigger((QueueBindingMetadata)triggerMetadata); break; case BindingType.BlobTrigger: triggerParameter = ParseBlobTrigger((BlobBindingMetadata)triggerMetadata); break; case BindingType.ServiceBusTrigger: triggerParameter = ParseServiceBusTrigger((ServiceBusBindingMetadata)triggerMetadata); break; case BindingType.TimerTrigger: omitInputParameter = true; triggerParameter = ParseTimerTrigger((TimerBindingMetadata)triggerMetadata, typeof(TimerInfo)); break; case BindingType.HttpTrigger: if (!triggerNameSpecified) { triggerMetadata.Name = triggerParameterName = "req"; } triggerParameter = ParseHttpTrigger((HttpBindingMetadata)triggerMetadata, methodAttributes, typeof(HttpRequestMessage)); break; case BindingType.ManualTrigger: triggerParameter = ParseManualTrigger(triggerMetadata, methodAttributes); break; } Collection <ParameterDescriptor> parameters = new Collection <ParameterDescriptor>(); triggerParameter.IsTrigger = true; parameters.Add(triggerParameter); // Add a TraceWriter for logging parameters.Add(new ParameterDescriptor("log", typeof(TraceWriter))); // Add an IBinder to support the binding programming model parameters.Add(new ParameterDescriptor("binder", typeof(IBinder))); // Add ExecutionContext to provide access to InvocationId, etc. parameters.Add(new ParameterDescriptor("context", typeof(ExecutionContext))); string scriptFilePath = Path.Combine(Config.RootScriptPath, functionMetadata.Source); IFunctionInvoker invoker = CreateFunctionInvoker(scriptFilePath, triggerMetadata, functionMetadata, omitInputParameter, inputBindings, outputBindings); functionDescriptor = new FunctionDescriptor(functionMetadata.Name, invoker, functionMetadata, parameters, methodAttributes); return(true); }