我构建了一个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
?
答案 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 中的 FunctionsStartupAttribute
和 IFunctionsHostBuilder
,例如:
[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