获取Azure Function App v2的根目录

时间:2018-10-26 19:26:02

标签: azure-functions

我构建了一个Azure Function应用(v2)。所有功能所需的配置任务都在Setup类中完成,该类的结构如下:

import re

port = input("Enter port number:")

if bool(re.search('\/', port)) == True:
    p = port

elif int(port) <= 48:
    port = "1/" + str(port)

elif int(port) >= 53 <= 100:
    port = "2/" + str(port)

elif int(port) >= 105 <= 152:
    port = "3/" + str(port)

elif int(port) >= 157 <= 204:
    port = "4/" + str(port)

print(port)

[assembly: WebJobsStartup(typeof(Startup))] internal class Startup : IWebJobsStartup { public void Configure(IWebJobsBuilder builder) { Configuration = new ConfigurationBuilder() .SetBasePath(<functionAppDirectory>) .AddJsonFile("local.settings.json") .Build(); builder.AddDependencyInjection(ConfigureServices); } public IConfiguration Configuration { get; set; } private void ConfigureServices(IServiceCollection services) { var connection = Configuration.GetConnectionString("<myconnection-string>"); ... } } 中,我想从配置文件中读取连接字符串。为此,已使用ConfigureServices指定了功能应用程序基本文件夹。但是我发现没有办法访问此路径。根据{{​​3}},可以将SetBasePath插入包含路径需求的函数中。但是如何在我的ExecutionContext类中访问ExecutionContext

7 个答案:

答案 0 :(得分:2)

您可以在启动文件中使用这段代码。 今天,我刚刚为我的项目对其进行了测试,它可以在云和本地环境中工作。

var executioncontextoptions = builder.Services.BuildServiceProvider()
    .GetService<IOptions<ExecutionContextOptions>>().Value;
var currentDirectory = executioncontextoptions.AppDirectory;

答案 1 :(得分:1)

您在哪里尝试使用此连接字符串?在此之前,我已经回答了类似(但不完全)的问题-可以帮助您获得所需的东西吗? https://github.com/Azure/azure-webjobs-sdk/issues/1817#issuecomment-418430676

答案 2 :(得分:1)

我在Startup()方法中为配置生成器找到的唯一解决方法是使用硬编码的路径“ / home / site / wwwroot /”

var config = new ConfigurationBuilder()
                .SetBasePath("/home/site/wwwroot/")
                .AddJsonFile("config.json", optional: false)
                .Build();

System.Environment.CurrentDirectory在Azure中不起作用。虽然它在本地工作。但是在Azure中,它会给出错误:找不到配置文件'config.json',它不是可选的。物理路径为“ /config.json”。功能无法启动。

答案 3 :(得分:1)

TL; DR:只需使用Environment.GetEnvironmentVariable。

ConfigurationBuilder方法出现在许多博客文章中,并且一直进行到我们开始进行DI为止。但是没有上下文参数,因此ConfigurationBuilder立即开始引起一些压力。

我认为人们朝着这个方向发展是因为在Azure Functions 2中,我们切换到ASP.NET Core配置,这导致ConfigurationManager停止工作。 ConfigurationBuilder是一个合理的着陆场所。它与MVC保持一致,并且在引入DI之前一直运行良好。

但是,既然我们正在做DI,那么很明显,对于该平台,Environment.GetEnvironmentVariable可能一直是更好的选择...代码开销更少,并且可以清晰地映射到Azure Functions的配置模型:开发人员,它将在local.settings.json> Values数组中拾取项目,在生产环境中,它将拾取您的环境变量,并且它可以正常工作。

这与我们在MVC中所做的不同。但是,在这些平台变得更接近平价之前,我们应该做在Function中有意义的事情,而不是试图从MVC强制解决方案。

所以:

[assembly: WebJobsStartup(typeof(StartUp))]
namespace Keystone.AzureFunctions
{

    public class StartUp : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {           
            var connectionString = Environment.GetEnvironmentVariable("KeystoneDB");

            // Configure EF
            builder.Services.AddDbContext<KeystoneDB>(options => options.UseSqlServer(connectionString));
        }
    }
}

您的local.settings.json可能看起来像这样:

{
    "IsEncrypted": false,
    "Values": {
        "KeystoneDB": "[CONNECTION STRING HERE]"
        "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    }
}

您还可以将Key Vault与环境一起使用。效果很好。

答案 4 :(得分:0)

问候,
我找到了可以在Startup中使用的解决方案:

var fileInfo = new FileInfo(Assembly.GetExecutingAssembly().Location);
string path = fileInfo.Directory.Parent.FullName;
var configuration = new ConfigurationBuilder()
    .SetBasePath(Environment.CurrentDirectory)
    .SetBasePath(path)
    .AddJsonFile("appsettings.json", false)
    .Build();

答案 5 :(得分:0)

您可能希望使用 Microsoft.Azure.Functions.Extensions 中的 FunctionsStartupAttributeIFunctionsHostBuilder,例如:

[assembly:FunctionsStartup(typeof(SampleFunction.FunctionsAppStartup))]

namespace SampleFunction
{
  public class FunctionsAppStartup : FunctionsStartup
  {
    public override void Configure(IFunctionsHostBuilder builder)
    {
      string appRootPath = builder.GetContext().ApplicationRootPath;

      // ...
    }
  }
}

答案 6 :(得分:-1)

尝试使用Environment.CurrentDirectory