private static Task <FunctionExecutor> GetAsync(string functionDir, string functionJsonFileName, TraceWriter log) { TaskCompletionSource <FunctionExecutor> tcs; lock (_d) { if (_d.TryGetValue(functionJsonFileName, out tcs)) { return(tcs.Task); } _d.Add(functionJsonFileName, tcs = new TaskCompletionSource <FunctionExecutor>()); } try { var functionJsonLastWriteTime = File.GetLastWriteTimeUtc(functionJsonFileName); var functionJson = JObject.Parse(File.ReadAllText(functionJsonFileName)); var metadata = functionJson["cloudPad"]; var applicationBase = (string)metadata["applicationBase"]; var scriptFile = (string)metadata["scriptFile"]; var typeName = (string)metadata["typeName"]; var methodName = (string)metadata["methodName"]; var providerName = (string)metadata["providerName"]; var connectionString = (string)metadata["connectionString"]; log.Info($"InitializingFunction ApplicationBase='{applicationBase}', ScriptFile='{scriptFile}'", nameof(FunctionExecutor)); var root = Path.GetFullPath(Path.Combine(functionDir, applicationBase)); var fullPath = Path.Combine(root, scriptFile); var dir = Path.GetDirectoryName(fullPath); // binder... UpdateAssemblyResolveHandler(functionDir, root); log.Info($"ScriptFileLoad '{fullPath}'", nameof(FunctionExecutor)); var assembly = Assembly.LoadFrom(fullPath); var type = assembly.GetType(typeName); var method = type.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance); var func = FunctionBinder.Bind(method); // launch cleanup task var f = new FunctionExecutor(func, functionJsonLastWriteTime, dir, providerName: providerName, connectionString: connectionString); tcs.SetResult(f); } catch (Exception ex) { tcs.SetException(ex); } return(tcs.Task); }
public static async Task Run( CloudBlockBlob blob, System.Threading.CancellationToken cancellationToken, ExecutionContext executionContext, // note that this name is also found in namespace "System.Threading" we don't want that TraceWriter log) { var func = await FunctionExecutor.GetAndInvalidateAsync(executionContext.FunctionDirectory, log); var arguments = new FunctionArgumentList(); arguments.AddArgument(typeof(CloudBlockBlob), blob); arguments.AddArgument(typeof(System.Threading.CancellationToken), cancellationToken); arguments.AddArgument(typeof(ITraceWriter), new TraceWriterWrapper(log)); var cloudStorageHelperType = typeof(ICloudStorage); if (func.Function.ParameterBindings.HasBinding(cloudStorageHelperType)) { arguments.AddArgument(cloudStorageHelperType, new CloudStorage(CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("AzureWebJobsStorage")))); } await func.InvokeAsync(arguments, log); }