我有多个Azure功能部署在不同的Azure功能插槽中。这些函数基于CloudStorage QueueMessage调用,如下所示。
// Get storage account
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Next, create a queue client
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
// Then retrieve a reference to a queue – here’s where you give your queue a name
CloudQueue queue = queueClient.GetQueueReference(queueName);
// Create the queue if it doesn’t already exist
queue.CreateIfNotExists();
// Penultimate step – create a message and add it to the queue.
CloudQueueMessage message = new CloudQueueMessage(bordereauxId.ToString());
// Finally, add your message to the queue
queue.AddMessage(message);
// Fetch the queue attributes.
queue.FetchAttributes();
有没有办法根据插槽对消息进行排队。例如,如果用户正在使用开发站点,则函数队列应使用相同的存储帐户调用属于Devlopment Slot的函数。
答案 0 :(得分:2)
正如@MurrayFoxcroft建议的那样,您应该使用每插槽应用设置来配置每个App Slot的存储帐户。
要添加,您应该使用Storage Queue output binding替换所引用的所有代码:
{
"type": "queue",
"direction": "out",
"name": "$return",
"queueName": "outqueue",
"connection": "StorageConnectionString",
}
然后该函数将返回队列消息(您也可以使用params)。
StorageConnectionString
应该是固定到App Slot的应用设置。
答案 1 :(得分:1)
您可以使用以下命令确定您的功能是否在插槽中运行:
var slot = System.Environment.GetEnvironmentVariable("APPSETTING_WEBSITE_SLOT_NAME", EnvironmentVariableTarget.Process);
然后,您可以使用结果将代码指向正确的路径。
但是,在可能的情况下,我会避免使用逻辑编码来处理基于插槽的不同场景。尝试尽可能地从配置中驱动逻辑。例如,在AppSettings中,您可以配置粘滞设置(插槽设置)以提供每个插槽的配置。
在本地运行时,您应该使用Azure Functions Core Tools进行调试。 See this link。将示例应用程序设置放在localsettings.json中以测试您的函数。适当更改它们或使用多个文件来模拟您的插槽。
答案 2 :(得分:0)
我通过根据插槽
创建队列名称来获得解决方案因此,在我的控制台应用程序中,队列名称基于我要调用的插槽并添加到配置文件中。
// Then retrieve a reference to a queue – here’s where you give your queue a name
CloudQueue queue = queueClient.GetQueueReference(queueName + "_" + slotname);
根据插槽应用程序设置
定义函数中的队列名称因此,在Azure函数方法中,队列名称将定义如下
public static void Run([QueueTrigger("%slot_queue_name%", Connection = "AzureWebJobsStorage")]string myQueueItem)
将在Azure功能插槽应用程序设置中定义“slot_queue_name”。