public WebAppProxy(RequestDelegate requestDelegate, WebAppServiceProvider serviceProvider)
 {
     _requestDelegate = requestDelegate;
     _serviceProvider = serviceProvider;
 }
        public override void Configure(IFunctionsHostBuilder builder)
        {
            try
            {
                // get content and webroot path for the function app.
                var assemblyPath    = new DirectoryInfo(Path.GetDirectoryName(typeof(Startup).Assembly.Location));
                var contentRootPath = assemblyPath.Parent.FullName;
                var webRootPath     = Path.Combine(contentRootPath, "wwwroot");

                // create config and hosting environment
                var configRoot = new ConfigurationBuilder()
                                 .SetBasePath(contentRootPath)
                                 .AddEnvironmentVariables()
                                 .Build();

                var config = configRoot.GetWebJobsRootConfiguration();

                var hostingEnv = new FunctionAppHostingEnvironment()
                {
                    ContentRootPath         = contentRootPath,
                    WebRootPath             = webRootPath,
                    ContentRootFileProvider = new PhysicalFileProvider(contentRootPath),
                    WebRootFileProvider     = new PhysicalFileProvider(webRootPath),
                    ApplicationName         = typeof(Host.Startup.Startup).Assembly.FullName,
                    EnvironmentName         = Environments.Development
                };

                // configure services for web app.
                var webAppServices   = new ServiceCollection();
                var diagnosticSource = new DiagnosticListener(hostingEnv.ApplicationName);
                webAppServices.AddSingleton <DiagnosticSource>(diagnosticSource);
                webAppServices.AddSingleton(diagnosticSource);
                webAppServices.AddSingleton <ObjectPoolProvider>(new DefaultObjectPoolProvider());
                webAppServices.AddSingleton <IHostApplicationLifetime, ApplicationLifetime>();
                webAppServices.AddSingleton <IWebHostEnvironment>(hostingEnv);
                webAppServices.AddSingleton <IConfiguration>(configRoot);

                // startup webapp
                var webAppStartUp   = new Host.Startup.Startup(hostingEnv);
                var serviceProvider = webAppStartUp.ConfigureServices(webAppServices);


                //var serviceProvider = webAppServices.BuildServiceProvider();
                var appBuilder = new ApplicationBuilder(serviceProvider, new FeatureCollection());

                webAppStartUp.Configure(appBuilder);

                // create request delegate from the configured app builder
                var requestDelegate = appBuilder.Build();

                builder.Services.AddSingleton(requestDelegate);

                // create instance of WebApp ServiceProvider for resolving the service provider for the web app over DI.
                var webAppServiceProvider = new WebAppServiceProvider
                {
                    ServiceProvider = serviceProvider
                };

                builder.Services.AddSingleton(webAppServiceProvider);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);

                // log exception to app insights if instrumentation key is available.
                var appInsightsInstrumentationKey = Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process);
                if (!string.IsNullOrWhiteSpace(appInsightsInstrumentationKey))
                {
#pragma warning disable CS0618 // Type or member is obsolete
                    var telemetryClient = new TelemetryClient {
                        InstrumentationKey = appInsightsInstrumentationKey
                    };
#pragma warning restore CS0618 // Type or member is obsolete

                    telemetryClient.TrackException(e);
                }

                throw e;
            }
        }