我正在开发一个我想与多个 Azure 网站一起使用的 Azure WebJobs 可执行文件。每个网站都需要自己的 Azure 存储队列。
我看到的问题是ProcessQueueMessage
需要将队列名称静态定义为第一个参数的属性inputText
。我宁愿让队列名称成为正在运行的 Azure 网站实例的配置属性,并让作业可执行文件在运行时启动时读取它。
有没有办法做到这一点?
我正在开发一个我想与多个 Azure 网站一起使用的 Azure WebJobs 可执行文件。每个网站都需要自己的 Azure 存储队列。
我看到的问题是ProcessQueueMessage
需要将队列名称静态定义为第一个参数的属性inputText
。我宁愿让队列名称成为正在运行的 Azure 网站实例的配置属性,并让作业可执行文件在运行时启动时读取它。
有没有办法做到这一点?
现在可以做到这一点。只需创建一个INameResolver
以允许您解析任何用 %(百分比)符号包围的字符串。例如,如果这是您指定了队列名称的函数:
public static void WriteLog([QueueTrigger("%logqueue%")] string logMessage)
{
Console.WriteLine(logMessage);
}
注意字符串周围有 %(百分比)符号logqueue
。这意味着工作系统将尝试使用INameResolver
您可以创建的名称来解析名称,然后在您的工作中注册。
下面是一个解析器示例,它将只获取百分号中指定的字符串,并在配置文件的 AppSettings 中查找它:
public class QueueNameResolver : INameResolver
{
public string Resolve(string name)
{
return ConfigurationManager.AppSettings[name].ToString();
}
}
然后在您的 Program.cs 文件中,您只需要将其连接起来:
var host = new JobHost(new JobHostConfiguration
{
NameResolver = new QueueNameResolver()
});
host.RunAndBlock();
这可能是一个老问题,但以防其他人偶然发现这篇文章。现在通过将JobHostConfiguration
对象传递给 JobHost 构造函数来支持这一点。
名称解析器的一个更好的实现,以避免一直从配置中获取。它使用 aDictionary
来存储检索到的配置值。
using Microsoft.Azure.WebJobs;
using System.Collections.Generic;
using System.Configuration;
public class QueueNameResolver : INameResolver
{
private static Dictionary<string, string> keys = new Dictionary<string, string>();
public string Resolve(string name)
{
if (!keys.ContainsKey(name))
{
keys.Add(name, ConfigurationManager.AppSettings[name].ToString());
}
return keys[name];
}
}
不幸的是,这是不可能的。您可以使用该IBinder
接口动态绑定到队列,但您将没有触发机制。
基本上,如果您想要触发器,则必须对输入队列名称进行硬编码。对于输出,您可以使用前面提到的接口。
这是一个示例IBinder
。该示例动态绑定 blob,但您可以对队列执行非常类似的操作。