示例#1
0
        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);
        }
示例#2
0
        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);
        }