Azure Functions绑定重定向 [英] Azure Functions binding redirect
问题描述
是否可以在azure函数文件夹结构中包含web.config或app.config文件,以允许程序集绑定重定向?
Is it possible to include a web.config or app.config file in the azure functions folder structure to allow assembly binding redirects?
推荐答案
假设您使用的是最新的(June'17)Visual Studio 2017 Function Tooling,在 npiasecki $发布的代码片段之后,我为此导出了一个合理的基于配置的解决方案。 c $ c>在
Assuming you are using the latest (June'17) Visual Studio 2017 Function Tooling, I derived a somewhat-reasonable config-based solution for this following a snippet of code posted by npiasecki
over on Issue #992.
如果这是通过框架进行管理,那将是理想的选择,但是至少受配置驱动,您需要更多的变更隔离。我想您还可以在编写此配置或生成代码之前,使用一些预构建步骤或T4模板来调和项目中nuget的版本(及其依赖关系)。
It would be ideal if this were managed through the framework, but at least being configuration-driven you have a bit more change isolation. I suppose you could also use some pre-build steps or T4 templating that reconciles the versions of the nugets in the project (and their dependencies) before writing out this config or generating code.
..不得不记住要更新当您更新NuGet程序包时,使用BindingRedirects
配置(无论如何,这在app.configs中通常是一个问题)。如果您需要重定向 Newtonsoft
。
.. becomes having to remember to update the BindingRedirects
config when you update the NuGet package (this is often a problem in app.configs anyway). You may also have an issue with the config-driven solution if you need to redirect Newtonsoft
.
您可能还对配置驱动的解决方案有疑问。 ,我们使用的是新的Azure Fluent NuGet,它依赖于 Microsoft.IdentityModel.Clients.ActiveDirectory
的旧版本,而不是所使用的常规ARM管理库的版本。并排在特定功能中。
In our case, we were using the new Azure Fluent NuGet that had a dependency on an older version of Microsoft.IdentityModel.Clients.ActiveDirectory
than the version of the normal ARM management libraries which are used side-by-side in a particular Function.
{
"IsEncrypted": false,
"Values": {
"BindingRedirects": "[ { \"ShortName\": \"Microsoft.IdentityModel.Clients.ActiveDirectory\", \"RedirectToVersion\": \"3.13.9.1126\", \"PublicKeyToken\": \"31bf3856ad364e35\" } ]"
}
}
FunctionUtilities.cs
FunctionUtilities.cs
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Globalization;
using System.Linq;
using System.Reflection;
namespace Rackspace.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;
}
}
}
这篇关于Azure Functions绑定重定向的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!