У меня есть приложение-функция, в котором мне нужно развернуть функцию serviceBusTrigger после действий пользователя в приложении. Для этого я использовал следующую запись Развертывание функции Azure из кода (c #) .
Функция Azure версии 2.0 для этого приложения функции
В настоящее время я создаю zip-файл, содержащий /function.json, который публикуется в конечной точке api / zip с использованием следующего метода
public void CreateAzureFunctionToMonitorQueue(string functionName, string serviceBusQueueName, string path)
{
// create zip of new function
// ZipFile.CreateFromDirectory will create a zip with the directory's name containing the directory's contents
// so CreateZipOfFunc creates a structure <functionName>/<functionName>/function.json
// so that the zip contains <functionName>/function.json
// which is the required input for api/zip/ from kudu api
var zipFile = CreateZipOfFunc(functionName, serviceBusQueueName, path);
var file = File.ReadAllBytes(zipFile);
MemoryStream stream = new MemoryStream(file);
using (var client = new HttpClient())
{
// deploy zip using Kudu REST api
client.DefaultRequestHeaders.Add("Authorization", "Basic " + _base64Auth);
var baseUrl = new Uri($"https://{_webFunctionAppName}.scm.azurewebsites.net/");
var requestURl = baseUrl + "api/zip/site/wwwroot";
var httpContent = new StreamContent(stream);
var response = client.PutAsync(requestURl, httpContent).Result;
}
// remove files
Directory.Delete($"{path}{functionName}", true);
File.Delete($"{path}{functionName}.zip");
// deployment using Kudu REST api requires the function triggers to be manually synced
SyncTriggers();
}
В конце я запускаю SyncTriggers, который вручную синхронизирует триггер приложения функции, потому что я прочитал, что для развертывания этого способа требуется это для всех триггеров, кроме http, найденный здесь https://docs.microsoft.com/en-us/azure/azure-functions/functions-deployment-technologies. Я использую второй метод ручной синхронизации триггеров , Ниже приведен метод
public void SyncTriggers()
{
using (var client = new HttpClient())
{
var requestUrl = $"https://{_webFunctionAppName}.azurewebsites.net/admin/host/synctriggers?code={_MASTER_KEY}";
var httpContent = new StringContent("");
var response = client.PostAsync(requestUrl, httpContent).Result;
}
}
Результат обоих запросов успешен, и когда я смотрю на портале Azure, появляется новая функция с файлом function.json, который соответствует работающему serviceBusTrigger при развертывании с использованием веб-приложения Visual Studio.
Для проверки этого я сначала отключаю работающую функцию Azure, запускаю приведенный выше код и затем помещаю новое сообщение в отслеживаемую очередь; однако ничего не происходит, когда сообщение становится активным.
Если я включу функцию, развернутую с использованием уже существующей VS, эта функция сработает и обработает сообщение.
Файл function.json существующей функции выглядит следующим образом
{
"generatedBy": "Microsoft.NET.Sdk.Functions-1.0.26",
"configurationSource": "attributes",
"bindings": [
{
"type": "serviceBusTrigger",
"connection": "ServiceBusConnection",
"queueName": "myqueue",
"name": "queueItem"
}
],
"disabled": false,
"scriptFile": "../bin/MyProject.MyLibrary.dll",
"entryPoint": "MyProject.MyLibrary.MyClass.RunAsync"
}
Функция, развернутая с использованием вышеуказанного метода, имеет функцию.json, подобную следующей
{
"generatedBy": "Microsoft.NET.Sdk.Functions - 1.0.26",
"configurationSource": "attributes",
"bindings": [
{
"type": "serviceBusTrigger",
"connection": "ServiceBusConnection",
"queueName": "myqueue",
"name": "queueItem"
}
],
"disabled": false,
"scriptFile": "../bin/MyProject.MyLibrary.dll",
"entryPoint": "MyProject.MyLibrary.MyClass.RunAsync"
}
Я что-то упустил? Мой вариант использования для этого: после создания новой очереди я хочу создать функцию наблюдения за лазурью для ее прослушивания. Создание очереди с использованием NameSpaceManager работает нормально, а отправка сообщений в нее также работает нормально. Я просто не могу заставить этот тестовый пример работать, когда я создаю функцию для мониторинга существующей очереди.
Возможно, функция не регистрируется и правильно настраивается при вызове SyncTrigger ??
Спасибо
Редактировать: Я только что видел этот пост https://blogs.msdn.microsoft.com/benjaminperkins/2018/08/07/why-does-my-azure-function-sometimes-stop-being-triggered/
который говорит:
Your endpoint must trigger/bind to only one Azure Function
Означает ли это, что я могу зарегистрировать только одну функцию в моей загруженной dll? Должен ли я вместо этого загрузить нужную мне копию метода точки входа с другим именем в виде .csx с файлом function.json?
Edit2: кажется, что это просто связано с az fns для привязки ресурса, похоже, не помогает
Edit3: После долгих исследований кажется, что источник конфигурации для моего сгенерированного function.json должен быть не «атрибутами», а «config». Собираюсь проверить это сейчас.
Edit4: проблема была устранена путем удаления generateBy и изменения конфигурационного источника на «config» в генерируемом мной файле function.json.
Редактировать5: удалены вводящие в заблуждение вопросы