是否可以在 azure 函数文件夹结构中包含 web.config 或 app.config 文件以允许程序集绑定重定向?
假设您正在使用最新的(2017 年 6 月)Visual Studio 2017 函数工具,我根据以下发布的代码片段得出了一个有点合理的基于配置的解决方案npiasecki
结束了问题#992 https://github.com/Azure/azure-webjobs-sdk-script/issues/992#issuecomment-298624059.
如果这是通过框架进行管理的,那将是理想的,但至少是配置驱动的,您可以有更多的更改隔离。我想您还可以使用一些预构建步骤或 T4 模板来协调项目中 nuget 的版本(及其依赖项),然后再编写此配置或生成代码。
所以缺点..
..变得必须记住更新BindingRedirects
更新 NuGet 包时的配置(无论如何,这通常是 app.configs 中的一个问题)。如果您需要重定向,您可能还会遇到配置驱动解决方案的问题Newtonsoft
.
在我们的例子中,我们使用的是新的 Azure Fluent NuGet,它依赖于旧版本的Microsoft.IdentityModel.Clients.ActiveDirectory
与在特定函数中并行使用的普通 ARM 管理库的版本相比。
本地.settings.json
{
"IsEncrypted": false,
"Values": {
"BindingRedirects": "[ { \"ShortName\": \"Microsoft.IdentityModel.Clients.ActiveDirectory\", \"RedirectToVersion\": \"3.13.9.1126\", \"PublicKeyToken\": \"31bf3856ad364e35\" } ]"
}
}
函数实用程序.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;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)