Возможно ли включить файл web.config или app.config в структуру папок с функциями лазурного листа, чтобы разрешить переадресацию связывания сборки?Azure Функции, связывающие переадресацию
ответ
Сегодня это невозможно, но мы думаем о путях достижения этого. Не могли бы вы открыть вопрос по адресу https://github.com/Azure/azure-webjobs-sdk-script/issues, чтобы убедиться, что ваш конкретный сценарий рассмотрен? Благодаря!
Предполагая, что вы используете новейший (June'17) Visual Studio 2017 Function Tooling, я получил несколько разумное решение на основе конфигурации для этого, следуя фрагменту кода, отправленному npiasecki
по адресу Issue #992.
Было бы идеально, если бы это было реализовано через фреймворк, но, по крайней мере, с помощью конфигурации, у вас есть немного более изоляция изменений. Я полагаю, вы могли бы также использовать некоторые шаги предварительной сборки или шаблоны T4, которые сверяли версии nugets в проекте (и их зависимости), прежде чем записывать эту конфигурацию или генерировать код.
Так оборотная .... становится, чтобы помнить, чтобы обновить BindingRedirects
конфигурации при обновлении пакета NuGet (это часто проблема в app.configs все равно). У вас также может быть проблема с конфигурационным решением, если вам нужно перенаправить Newtonsoft
.
В нашем случае мы использовали новый Azure Fluent NuGet, который имел зависимость от более старой версии Microsoft.IdentityModel.Clients.ActiveDirectory
, чем версия обычных библиотек управления ARM, которые используются бок о бок в конкретной функции.
{
"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 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;
}
}
}
Спасибо за это. Это в значительной степени необходимо для большинства проектов nuget. Надеясь, что они обратятся к этому в ближайшее время. – Grapes
Для тех, кто борется за выполнение этой работы: если у вас есть более одной версии, которую нужно отскочить, вам придется удалить строку AppDomain.CurrentDomain.AssemblyResolve - = обработчик; Поскольку это означало, что только первая найденная версия была перенаправлена. – bech
Просто отправил новое сообщение в блоге, объясняя, как решить эту проблему, имеют вид:
Это фактически приспособленная версия кода JoeBrockhaus в, который хорошо работает даже для Newtonsoft.Json.dll
Вдохновленных принятого ответом я решил сделать более общие один, который принимает в модернизацию счета, а также.
Он извлекает все сборки, заказывает их по убыванию, чтобы получить самую новую версию сверху, а затем возвращает самую новую версию при разрешении. Я называю это в статическом конструкторе.
public static void RedirectAssembly()
{
var list = AppDomain.CurrentDomain.GetAssemblies().OrderByDescending(a => a.FullName).Select(a => a.FullName).ToList();
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
var requestedAssembly = new AssemblyName(args.Name);
foreach (string asmName in list)
{
if (asmName.StartsWith(requestedAssembly.Name + ","))
{
return Assembly.Load(asmName);
}
}
return null;
};
}
новый связанный с этим вопрос: Предоставление Binding переадресовывает для CSX загрузки нескольких DLL # 1239 https://github.com/Azure/azure-webjobs-sdk-script/issues/1239 –