在 Azure-Functions 中配置文件和检索
Config files and retrieving in Azure-Functions
我一直在 Azure-Functions 中试验 .config 文件。
如果我写这个函数
using System;
using System.Configuration;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
namespace GranadaCoder.AzurePoc.AzureFunctionsOne
{
public static class AppSettingsTestOne
{
[FunctionName("AppSettingsTestOneFunctionName")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
try
{
string rootDirectory = string.Empty;
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("HOME")))
{
/* running in azure */
rootDirectory = Environment.GetEnvironmentVariable("HOME") + "\site\wwwroot";
}
else
{
/* in visual studio, local debugging */
rootDirectory = ".";
}
string path = rootDirectory + @"\CustomConfigFiles\CustomAppSettings.config";
if (!System.IO.File.Exists(path))
{
throw new System.IO.FileNotFoundException(string.Format("NOT FOUND!!! ('{0}')", path));
}
else
{
log.Info(string.Format("File exists='{0}'", path));
}
ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = path };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
Configuration fileConfig = ConfigurationManager.OpenExeConfiguration(path); /* does NOT work */
string val1 = config.AppSettings.Settings["KeyOne"].Value;
string val2 = config.AppSettings.Settings["KeyTwo"].Value;
string val3 = config.AppSettings.Settings["KeyThree"].Value;
string msg = string.Join(",", val1, val2, val3);
return req.CreateResponse(HttpStatusCode.OK, msg);
}
catch (Exception ex)
{
string errorMsg = ex.Message; // ExceptionHelper.GenerateFullFlatMessage(ex);
log.Error(errorMsg);
return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg);
}
}
}
}
使用此 .config 文件 (CustomAppSettings.config)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="KeyOne" value="ValueOne" />
<add key="KeyTwo" value="ValueTwo" />
<add key="KeyThree" value="ValueThree" />
</appSettings>
</configuration>
它按预期工作。
如果我使用这个函数:
using System;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Xml;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
namespace GranadaCoder.AzurePoc.AzureFunctionsOne
{
public static class NameValuePairAppSettingsTest
{
[FunctionName("NameValuePairAppSettingsTestFunctionName")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
try
{
string rootDirectory = string.Empty;
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("HOME")))
{
/* running in azure */
rootDirectory = Environment.GetEnvironmentVariable("HOME") + "\site\wwwroot";
}
else
{
/* in visual studio, local debugging */
rootDirectory = ".";
}
string path = rootDirectory + @"\CustomConfigFiles\NameValuePairSettings.config";
if (!System.IO.File.Exists(path))
{
throw new System.IO.FileNotFoundException(string.Format("NOT FOUND!!! ('{0}')", path));
}
else
{
log.Info(string.Format("file exists='{0}'", path));
}
ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = path };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
//NameValueCollection nvc = (NameValueCollection)config.GetSection("myLittleArea"); /* does not work */
ConfigurationSection myParamsSection = config.GetSection("myLittleArea");
/* see */
string myParamsSectionRawXml = myParamsSection.SectionInformation.GetRawXml();
XmlDocument sectionXmlDoc = new XmlDocument();
sectionXmlDoc.Load(new StringReader(myParamsSectionRawXml));
NameValueSectionHandler handler = new NameValueSectionHandler();
NameValueCollection nvc = handler.Create(null, null, sectionXmlDoc.DocumentElement) as NameValueCollection;
var items = nvc.AllKeys.SelectMany(nvc.GetValues, (k, v) => new { key = k, value = v });
////////foreach (var item in items)
////////{
//////// Console.WriteLine("{0} {1}", item.key, item.value);
////////}
string msg = string.Join(",", items.ToList());
return req.CreateResponse(HttpStatusCode.OK, msg);
}
catch (Exception ex)
{
string errorMsg = ex.Message; // ExceptionHelper.GenerateFullFlatMessage(ex);
log.Error(errorMsg);
return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg);
}
}
}
}
使用此 .config 文件 (NameValuePairSettings.config)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="myLittleArea" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<myLittleArea>
<add key="color" value="red"/>
<add key="street" value="main"/>
<add key="month" value="july"/>
<add key="candy" value="snickers"/>
</myLittleArea>
</configuration>
一切正常。
(鼓声)。
如果我创建自定义配置部分。
using System.Configuration;
namespace GranadaCoder.AzurePoc.ConfigurationLibrary.MyCustomConfigurationSettings
{
public static class MyCustomConfigurationSettingsConfigurationRetriever
{
public static readonly string ConfigurationSectionName = "MyCustomConfigurationSettingsConfigurationSectionName";
/*
public static MyCustomConfigurationSettingsConfigurationSection GetMyCustomConfigurationSettings()
{
MyCustomConfigurationSettingsConfigurationSection returnSection = (MyCustomConfigurationSettingsConfigurationSection)ConfigurationManager.GetSection(ConfigurationSectionName);
if (returnSection != null)
{
return returnSection;
}
return null;
}
*/
public static MyCustomConfigurationSettingsConfigurationSection GetMyCustomConfigurationSettings(System.Configuration.Configuration cfg)
{
MyCustomConfigurationSettingsConfigurationSection returnSection = (MyCustomConfigurationSettingsConfigurationSection)cfg.GetSection(ConfigurationSectionName);
if (returnSection != null)
{
return returnSection;
}
return null;
}
}
}
和
using System.Configuration;
namespace GranadaCoder.AzurePoc.ConfigurationLibrary.MyCustomConfigurationSettings
{
public class MyCustomConfigurationSettingsConfigurationSection : ConfigurationSection
{
private const string FavoriteNumberPropertyName = "FavoriteNumber";
private const string FavoriteColorPropertyName = "FavoriteColor";
[ConfigurationProperty(FavoriteNumberPropertyName, IsRequired = true, DefaultValue = 100)]
public int FavoriteNumber
{
get
{
return (int)this[FavoriteNumberPropertyName];
}
}
[ConfigurationProperty(FavoriteColorPropertyName, IsRequired = true, DefaultValue = ",")]
public string FavoriteColor
{
get
{
return (string)this[FavoriteColorPropertyName];
}
}
}
}
和.config (MyCustomConfigurationSettings.config)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name ="MyCustomConfigurationSettingsConfigurationSectionName" type="GranadaCoder.AzurePoc.ConfigurationLibrary.MyCustomConfigurationSettings.MyCustomConfigurationSettingsConfigurationSection, GranadaCoder.AzurePoc.ConfigurationLibrary" />
</configSections>
<MyCustomConfigurationSettingsConfigurationSectionName
FavoriteNumber="333"
FavoriteColor="Green"
>
</MyCustomConfigurationSettingsConfigurationSectionName>
</configuration>
和 azure 函数代码
using System;
using System.Configuration;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using GranadaCoder.AzurePoc.ConfigurationLibrary.MyCustomConfigurationSettings;
namespace GranadaCoder.AzurePoc.AzureFunctionsOne
{
public static class CustomConfigurationTest
{
[FunctionName("CustomConfigurationTestFunctionName")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
try
{
string rootDirectory = string.Empty;
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("HOME")))
{
/* running in azure */
rootDirectory = Environment.GetEnvironmentVariable("HOME") + "\site\wwwroot";
}
else
{
/* in visual studio, local debugging */
rootDirectory = ".";
}
string path = rootDirectory + @"\CustomConfigFiles\MyCustomConfigurationSettings.config";
log.Info(string.Format("CustomConfigurationTestFunctionName HostingEnvironment.ApplicationPhysicalPath='{0}'", System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath));
if (!System.IO.File.Exists(path))
{
throw new System.IO.FileNotFoundException(string.Format("NOT FOUND!!! ('{0}')", path));
}
else
{
log.Info(string.Format("File exists='{0}'", path));
}
ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = path };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
MyCustomConfigurationSettingsConfigurationSection customSection = MyCustomConfigurationSettingsConfigurationRetriever.GetMyCustomConfigurationSettings(config);
string msg = string.Join(",", customSection.FavoriteNumber.ToString(), customSection.FavoriteColor);
return req.CreateResponse(HttpStatusCode.OK, msg);
}
catch (Exception ex)
{
string errorMsg = ex.Message; // ExceptionHelper.GenerateFullFlatMessage(ex);
log.Error(errorMsg);
return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg);
}
}
}
}
上面的不行。
我收到一个错误
"An error occurred creating the configuration section handler for MyCustomConfigurationSettingsConfigurationSectionName: Could not load file or assembly 'GranadaCoder.AzurePoc.ConfigurationLibrary' or one of its dependencies. The system cannot find the file specified. (C:\blah\blah\blah\bin\Debug\net461\CustomConfigFiles\MyCustomConfigurationSettings.config line 4)"
文件在那里(见图)
知道为什么自定义配置不起作用吗?
在Azure Function中打印出当前域的BaseDirectory后,发现函数是运行 by fun.exe。它将在 "AppData\Local\Azure.Functions.Cli.0.1\" 文件夹中查找程序集。将 "GranadaCoder.AzurePoc.ConfigurationLibrary" 复制到文件夹后,该功能将正常运行。
代码:
string friendlyName = AppDomain.CurrentDomain.FriendlyName;
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
输出:
BaseDirectory = "C:\Users\myusername\AppData\Local\Azure.Functions.Cli\1.0.1\"
FriendlyName = "func.exe"
Azure 功能仅支持 app.config 的有限部分。当 运行ning 从 VS 运行时,它允许在 local.settings.json 中保存应用程序设置和连接。它不支持此 json 文件中 system.serviceModel 下的 WCF 端点设置。我在 AzureFunction 中有一个 dll 库引用,它在内部调用 WCF api。
我发现奇怪的是,当我 运行 Azure 函数时,它会在 cli 路径 (C:\Users\<<机器名 >>\AppData\Local\AzureFunctionsTools\Releases.6.0\cli\func.exe.config).我将我的 xml 配置层次结构 (system.serviceModel) 添加到此配置文件并且它工作正常,选择我的 WCF 端点到 运行 服务。尽管在使用 log4net 配置方面遇到了困难,但我对 运行 API 很满意。
希望对您有所帮助。
我一直在 Azure-Functions 中试验 .config 文件。
如果我写这个函数
using System;
using System.Configuration;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
namespace GranadaCoder.AzurePoc.AzureFunctionsOne
{
public static class AppSettingsTestOne
{
[FunctionName("AppSettingsTestOneFunctionName")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
try
{
string rootDirectory = string.Empty;
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("HOME")))
{
/* running in azure */
rootDirectory = Environment.GetEnvironmentVariable("HOME") + "\site\wwwroot";
}
else
{
/* in visual studio, local debugging */
rootDirectory = ".";
}
string path = rootDirectory + @"\CustomConfigFiles\CustomAppSettings.config";
if (!System.IO.File.Exists(path))
{
throw new System.IO.FileNotFoundException(string.Format("NOT FOUND!!! ('{0}')", path));
}
else
{
log.Info(string.Format("File exists='{0}'", path));
}
ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = path };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
Configuration fileConfig = ConfigurationManager.OpenExeConfiguration(path); /* does NOT work */
string val1 = config.AppSettings.Settings["KeyOne"].Value;
string val2 = config.AppSettings.Settings["KeyTwo"].Value;
string val3 = config.AppSettings.Settings["KeyThree"].Value;
string msg = string.Join(",", val1, val2, val3);
return req.CreateResponse(HttpStatusCode.OK, msg);
}
catch (Exception ex)
{
string errorMsg = ex.Message; // ExceptionHelper.GenerateFullFlatMessage(ex);
log.Error(errorMsg);
return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg);
}
}
}
}
使用此 .config 文件 (CustomAppSettings.config)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="KeyOne" value="ValueOne" />
<add key="KeyTwo" value="ValueTwo" />
<add key="KeyThree" value="ValueThree" />
</appSettings>
</configuration>
它按预期工作。
如果我使用这个函数:
using System;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Xml;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
namespace GranadaCoder.AzurePoc.AzureFunctionsOne
{
public static class NameValuePairAppSettingsTest
{
[FunctionName("NameValuePairAppSettingsTestFunctionName")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
try
{
string rootDirectory = string.Empty;
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("HOME")))
{
/* running in azure */
rootDirectory = Environment.GetEnvironmentVariable("HOME") + "\site\wwwroot";
}
else
{
/* in visual studio, local debugging */
rootDirectory = ".";
}
string path = rootDirectory + @"\CustomConfigFiles\NameValuePairSettings.config";
if (!System.IO.File.Exists(path))
{
throw new System.IO.FileNotFoundException(string.Format("NOT FOUND!!! ('{0}')", path));
}
else
{
log.Info(string.Format("file exists='{0}'", path));
}
ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = path };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
//NameValueCollection nvc = (NameValueCollection)config.GetSection("myLittleArea"); /* does not work */
ConfigurationSection myParamsSection = config.GetSection("myLittleArea");
/* see */
string myParamsSectionRawXml = myParamsSection.SectionInformation.GetRawXml();
XmlDocument sectionXmlDoc = new XmlDocument();
sectionXmlDoc.Load(new StringReader(myParamsSectionRawXml));
NameValueSectionHandler handler = new NameValueSectionHandler();
NameValueCollection nvc = handler.Create(null, null, sectionXmlDoc.DocumentElement) as NameValueCollection;
var items = nvc.AllKeys.SelectMany(nvc.GetValues, (k, v) => new { key = k, value = v });
////////foreach (var item in items)
////////{
//////// Console.WriteLine("{0} {1}", item.key, item.value);
////////}
string msg = string.Join(",", items.ToList());
return req.CreateResponse(HttpStatusCode.OK, msg);
}
catch (Exception ex)
{
string errorMsg = ex.Message; // ExceptionHelper.GenerateFullFlatMessage(ex);
log.Error(errorMsg);
return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg);
}
}
}
}
使用此 .config 文件 (NameValuePairSettings.config)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="myLittleArea" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<myLittleArea>
<add key="color" value="red"/>
<add key="street" value="main"/>
<add key="month" value="july"/>
<add key="candy" value="snickers"/>
</myLittleArea>
</configuration>
一切正常。
(鼓声)。
如果我创建自定义配置部分。
using System.Configuration;
namespace GranadaCoder.AzurePoc.ConfigurationLibrary.MyCustomConfigurationSettings
{
public static class MyCustomConfigurationSettingsConfigurationRetriever
{
public static readonly string ConfigurationSectionName = "MyCustomConfigurationSettingsConfigurationSectionName";
/*
public static MyCustomConfigurationSettingsConfigurationSection GetMyCustomConfigurationSettings()
{
MyCustomConfigurationSettingsConfigurationSection returnSection = (MyCustomConfigurationSettingsConfigurationSection)ConfigurationManager.GetSection(ConfigurationSectionName);
if (returnSection != null)
{
return returnSection;
}
return null;
}
*/
public static MyCustomConfigurationSettingsConfigurationSection GetMyCustomConfigurationSettings(System.Configuration.Configuration cfg)
{
MyCustomConfigurationSettingsConfigurationSection returnSection = (MyCustomConfigurationSettingsConfigurationSection)cfg.GetSection(ConfigurationSectionName);
if (returnSection != null)
{
return returnSection;
}
return null;
}
}
}
和
using System.Configuration;
namespace GranadaCoder.AzurePoc.ConfigurationLibrary.MyCustomConfigurationSettings
{
public class MyCustomConfigurationSettingsConfigurationSection : ConfigurationSection
{
private const string FavoriteNumberPropertyName = "FavoriteNumber";
private const string FavoriteColorPropertyName = "FavoriteColor";
[ConfigurationProperty(FavoriteNumberPropertyName, IsRequired = true, DefaultValue = 100)]
public int FavoriteNumber
{
get
{
return (int)this[FavoriteNumberPropertyName];
}
}
[ConfigurationProperty(FavoriteColorPropertyName, IsRequired = true, DefaultValue = ",")]
public string FavoriteColor
{
get
{
return (string)this[FavoriteColorPropertyName];
}
}
}
}
和.config (MyCustomConfigurationSettings.config)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name ="MyCustomConfigurationSettingsConfigurationSectionName" type="GranadaCoder.AzurePoc.ConfigurationLibrary.MyCustomConfigurationSettings.MyCustomConfigurationSettingsConfigurationSection, GranadaCoder.AzurePoc.ConfigurationLibrary" />
</configSections>
<MyCustomConfigurationSettingsConfigurationSectionName
FavoriteNumber="333"
FavoriteColor="Green"
>
</MyCustomConfigurationSettingsConfigurationSectionName>
</configuration>
和 azure 函数代码
using System;
using System.Configuration;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using GranadaCoder.AzurePoc.ConfigurationLibrary.MyCustomConfigurationSettings;
namespace GranadaCoder.AzurePoc.AzureFunctionsOne
{
public static class CustomConfigurationTest
{
[FunctionName("CustomConfigurationTestFunctionName")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
try
{
string rootDirectory = string.Empty;
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("HOME")))
{
/* running in azure */
rootDirectory = Environment.GetEnvironmentVariable("HOME") + "\site\wwwroot";
}
else
{
/* in visual studio, local debugging */
rootDirectory = ".";
}
string path = rootDirectory + @"\CustomConfigFiles\MyCustomConfigurationSettings.config";
log.Info(string.Format("CustomConfigurationTestFunctionName HostingEnvironment.ApplicationPhysicalPath='{0}'", System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath));
if (!System.IO.File.Exists(path))
{
throw new System.IO.FileNotFoundException(string.Format("NOT FOUND!!! ('{0}')", path));
}
else
{
log.Info(string.Format("File exists='{0}'", path));
}
ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = path };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
MyCustomConfigurationSettingsConfigurationSection customSection = MyCustomConfigurationSettingsConfigurationRetriever.GetMyCustomConfigurationSettings(config);
string msg = string.Join(",", customSection.FavoriteNumber.ToString(), customSection.FavoriteColor);
return req.CreateResponse(HttpStatusCode.OK, msg);
}
catch (Exception ex)
{
string errorMsg = ex.Message; // ExceptionHelper.GenerateFullFlatMessage(ex);
log.Error(errorMsg);
return req.CreateResponse(HttpStatusCode.BadRequest, errorMsg);
}
}
}
}
上面的不行。
我收到一个错误
"An error occurred creating the configuration section handler for MyCustomConfigurationSettingsConfigurationSectionName: Could not load file or assembly 'GranadaCoder.AzurePoc.ConfigurationLibrary' or one of its dependencies. The system cannot find the file specified. (C:\blah\blah\blah\bin\Debug\net461\CustomConfigFiles\MyCustomConfigurationSettings.config line 4)"
文件在那里(见图)
知道为什么自定义配置不起作用吗?
在Azure Function中打印出当前域的BaseDirectory后,发现函数是运行 by fun.exe。它将在 "AppData\Local\Azure.Functions.Cli.0.1\" 文件夹中查找程序集。将 "GranadaCoder.AzurePoc.ConfigurationLibrary" 复制到文件夹后,该功能将正常运行。
代码:
string friendlyName = AppDomain.CurrentDomain.FriendlyName;
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
输出:
BaseDirectory = "C:\Users\myusername\AppData\Local\Azure.Functions.Cli\1.0.1\"
FriendlyName = "func.exe"
Azure 功能仅支持 app.config 的有限部分。当 运行ning 从 VS 运行时,它允许在 local.settings.json 中保存应用程序设置和连接。它不支持此 json 文件中 system.serviceModel 下的 WCF 端点设置。我在 AzureFunction 中有一个 dll 库引用,它在内部调用 WCF api。
我发现奇怪的是,当我 运行 Azure 函数时,它会在 cli 路径 (C:\Users\<<机器名 >>\AppData\Local\AzureFunctionsTools\Releases.6.0\cli\func.exe.config).我将我的 xml 配置层次结构 (system.serviceModel) 添加到此配置文件并且它工作正常,选择我的 WCF 端点到 运行 服务。尽管在使用 log4net 配置方面遇到了困难,但我对 运行 API 很满意。
希望对您有所帮助。