我有一个现有的功能应用程序,在用户在应用程序中进行操作后,需要向其部署serviceBusTrigger函数。为此,我一直在使用以下帖子Deploy Azure function from code (c#)。
此功能应用程序的天蓝色功能版本2.0
我当前正在创建一个包含/function.json的zip文件,该文件将使用以下方法发布到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文件,该文件与使用Visual Studio webdeploy进行部署的serviceBusTrigger匹配。
为了测试这一点,我首先禁用了工作中的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"
}
使用上述方法部署的函数具有如下的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"
}
我想念什么吗?我的用例是,在创建新队列之后,我想创建一个监控azure函数来监听它。使用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中向一个功能注册一个功能?相反,我是否应该使用function.json文件将我想要的入口点方法的副本以.csx的不同名称上传?
Edit2:这似乎与az fns绑定资源有关,似乎无济于事
Edit3:经过大量研究,似乎我生成的function.json的configurationSource不应为“ attributes”,而应为“ config”。现在要进行测试。
Edit4:该问题已通过以下方法解决:在我生成的function.json文件中,删除了generateBy,并将configurationSource更改为“ config”。
Edit5:删除了误导性问题
答案 0 :(得分:0)
问题在于,使用VS部署的功能在function.json中具有两个属性
"generatedBy": "Microsoft.NET.Sdk.Functions - 1.0.26",
"configurationSource": "attributes",
实际上只是告诉azure从何处生成函数,并使用作为函数入口点的方法的属性作为配置源。删除generateByy允许一个人在azure门户中编辑该功能,并将configurationSource更改为“ config”,以告诉azure函数运行时使用function.json文件来绑定配置,而不使用绑定。
但是,在azure门户中,我收到一条消息
Error:
Function (MyFunction) Error: Configuration error: all functions in D:\home\site\wwwroot\bin\MyProject.MyLibrary.dll must have the same value for 'configurationSource'.
Session Id: MY_SESSION_ID
Timestamp: 2019-06-30T21:04:22.709Z
我部署的函数仍然有效,并且具有已部署函数调用的http绑定的其他现有函数仍然有效(它们具有由Skd.Functions和configurationSource生成的function.json文件:“ attributes”,因此不会目前似乎是一个成败错误;但是,我将更改部署,以便所有人都具有configurationSource:“ config”
因此将输出function.json更改为
{
"configurationSource": "config",
"bindings": [
{
"type": "serviceBusTrigger",
"connection": "ServiceBusConnection",
"queueName": "myqueue",
"name": "queueItem"
}
],
"disabled": false,
"scriptFile": "../bin/MyProject.MyLibrary.dll",
"entryPoint": "MyProject.MyLibrary.MyClass.RunAsync"
}
解决了我的问题