c# - Azure Functions 绑定(bind)重定向

标签 c# visual-studio-2017 azure-functions assembly-binding-redirect azure-functions-runtime

是否可以在 azure 函数文件夹结构中包含 web.config 或 app.config 文件以允许程序集绑定(bind)重定向?

最佳答案

假设您使用的是最新的(2017 年 6 月)Visual Studio 2017 函数工具,我根据 npiaseckiIssue #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/

相关文章:

azure - 无法在 VSCode 中调试 Azure Functions Core Tools

c# - 我应该怎么做才能在 .NET 2.0 中使用 Task<T>?

git - 我应该在版本控制中忽略哪些由 Visual Studio 2017 创建的文件?

c# - 如何使用 Visual Studio 2017 自动将光标放在自己行的大括号之间

c# - Visual Studio 2017 中的错误 "missing assembly reference"

python - Azure Functions 可以用 Python 编写吗?

python - Azure 函数 python 命名参数没有值

c# - cshtml图片链接可点击区域太大

c# - 来自 Mosha Pasumansky 的 XAML 数据透视表

c# - 仅在 EF Core 中的 Scaffold-DbContext 存储过程