我可以如何向Azure函数提供设置文件?

时间:2018-09-17 05:58:14

标签: c# azure azure-functions xero-api

将使用设置文件的应用程序移植到Azure函数时,是否有必要消除对文件的依赖?

我想编写一个功能应用程序,以将数据从Xero导入Azure SQL数据库。 我正在使用的Xero SDK需要一个appsettings.json文件。

因此,当函数运行时,我会收到错误消息

System.Private.CoreLib: Exception while executing function:
FunctionXeroSync. Xero.Api: The type initializer for 
'Xero.Api.Infrastructure.Applications.Private.Core' threw an exception. 
Microsoft.Extensions.Configuration.FileExtensions: The configuration file 
'appsettings.json' was not found and is not optional. The physical path is 
'C:\Users\kirst\AppData\Local\AzureFunctionsTools\Releases\2.6.0\cli\appsettings.json'.

我尝试通过VS2017项目发布选项卡上的“管理应用程序设置”链接来放入相关设置。显然,这失败了。还有其他方法可以使用吗?

这是api中的相关代码。我希望不必修改它,以便可以使用官方的nuget软件包。

namespace Xero.Api
{
    public class XeroApiSettings : IXeroApiSettings
    {
        public IConfigurationSection ApiSettings { get; set; }

        public XeroApiSettings(string settingspath)
        {

            var builder = new ConfigurationBuilder()
                .AddJsonFile(settingspath)
                .Build();

            ApiSettings = builder.GetSection("XeroApi");
        }
        public XeroApiSettings() : this("appsettings.json")
        {
        }

        public string BaseUrl => ApiSettings["BaseUrl"];

        public string CallbackUrl => ApiSettings["CallbackUrl"];

        public string ConsumerKey => ApiSettings["ConsumerKey"];

        public string ConsumerSecret => ApiSettings["ConsumerSecret"];

        public string SigningCertificatePath => ApiSettings["SigningCertPath"];

        public string SigningCertificatePassword => ApiSettings["SigningCertPassword"];

        public string AppType => ApiSettings["AppType"];

        public bool IsPartnerApp => AppType?.Equals("partner", StringComparison.OrdinalIgnoreCase) ?? false;
    }
}

当我添加

    log.LogInformation("base directory: "+AppDomain.CurrentDomain.BaseDirectory);

我得到的功能

 D:\Program Files (x86)\SiteExtensions\Functions\2.0.12095-alpha\32bit\

在门户网站中运行时

2 个答案:

答案 0 :(得分:2)

This Jon Gallant's blog建议您将可选参数添加到AddJsonFile,因为部署时该参数不存在:

var config = new ConfigurationBuilder()
    .SetBasePath(context.FunctionAppDirectory)
    .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
    .AddEnvironmentVariables()
    .Build();

请注意,在Azure中,这将引用'appsettings.json'文件

答案 1 :(得分:2)

  

将使用设置文件的应用程序移植到Azure函数时,是否有必要消除对文件的依赖?

不是必需的,我们仍然可以使用应用程序所需的设置文件。我们只需要确保设置文件的路径正确即可。

  1. appsettings.json放在函数项目下,并将其设置为复制到输出/发布目录。

    set file property

  2. 在Azure Function方法签名中添加ExecutionContext context,用于查找当前函数app目录(位于appsettings.json所在的目录)。

  3. 在Azure函数中传递appsettings.json的有效路径以初始化XeroApiSettings。

    var xeroApiSettings = new XeroApiSettings(context.FunctionAppDirectory+"/appsettings.json");