是否可以在 azure 函数文件夹结构中包含 web.config 或 app.config 文件以允许程序集绑定(bind)重定向?
最佳答案
假设您使用的是最新的(2017 年 6 月)Visual Studio 2017 函数工具,我根据 npiasecki
在 Issue #992 上发布的一段代码推导出了一个基于配置的合理解决方案.
如果这是通过框架管理的,那将是理想的,但至少是配置驱动的,你有更多的变更隔离。我想您还可以使用一些预构建步骤或 T4 模板来协调项目中 nuget 的版本(及其依赖项),然后再编写此配置或生成代码。
所以缺点..
.. 更新 NuGet 包时必须记住更新 BindingRedirects
配置(这通常是 app.configs 中的问题)。如果您需要重定向 Newtonsoft
,您可能还会遇到配置驱动解决方案的问题。
在我们的例子中,我们使用的是新的 Azure Fluent NuGet,它依赖于 Microsoft.IdentityModel.Clients.ActiveDirectory
的旧版本,而不是所使用的普通 ARM 管理库的版本在特定功能中并排。
local.settings.json
{
"IsEncrypted": false,
"Values": {
"BindingRedirects": "[ { \"ShortName\": \"Microsoft.IdentityModel.Clients.ActiveDirectory\", \"RedirectToVersion\": \"3.13.9.1126\", \"PublicKeyToken\": \"31bf3856ad364e35\" } ]"
}
}
FunctionUtilities.cs
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Globalization;
using System.Linq;
using System.Reflection;
namespace Utilities.AzureFunctions
{
public static class FunctionUtilities
{
public class BindingRedirect
{
public string ShortName { get; set; }
public string PublicKeyToken { get; set; }
public string RedirectToVersion { get; set; }
}
public static void ConfigureBindingRedirects()
{
var config = Environment.GetEnvironmentVariable("BindingRedirects");
var redirects = JsonConvert.DeserializeObject<List<BindingRedirect>>(config);
redirects.ForEach(RedirectAssembly);
}
public static void RedirectAssembly(BindingRedirect bindingRedirect)
{
ResolveEventHandler handler = null;
handler = (sender, args) =>
{
var requestedAssembly = new AssemblyName(args.Name);
if (requestedAssembly.Name != bindingRedirect.ShortName)
{
return null;
}
var targetPublicKeyToken = new AssemblyName("x, PublicKeyToken=" + bindingRedirect.PublicKeyToken)
.GetPublicKeyToken();
requestedAssembly.Version = new Version(bindingRedirect.RedirectToVersion);
requestedAssembly.SetPublicKeyToken(targetPublicKeyToken);
requestedAssembly.CultureInfo = CultureInfo.InvariantCulture;
AppDomain.CurrentDomain.AssemblyResolve -= handler;
return Assembly.Load(requestedAssembly);
};
AppDomain.CurrentDomain.AssemblyResolve += handler;
}
}
}
关于c# - Azure Functions 绑定(bind)重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38093972/