46

我正在开发一个我想与多个 Azure 网站一起使用的 Azure WebJobs 可执行文件。每个网站都需要自己的 Azure 存储队列。

我看到的问题是ProcessQueueMessage需要将队列名称静态定义为第一个参数的属性inputText。我宁愿让队列名称成为正在运行的 Azure 网站实例的配置属性,并让作业可执行文件在运行时启动时读取它。

有没有办法做到这一点?

4

4 回答 4

100

现在可以做到这一点。只需创建一个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();
于 2015-05-28T19:03:45.160 回答
2

这可能是一个老问题,但以防其他人偶然发现这篇文章。现在通过将JobHostConfiguration对象传递给 JobHost 构造函数来支持这一点。

http://azure.microsoft.com/en-gb/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues-how-to/#config

于 2015-01-26T09:35:39.910 回答
1

名称解析器的一个更好的实现,以避免一直从配置中获取。它使用 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];
    }
}
于 2018-06-19T08:10:53.483 回答
-1

不幸的是,这是不可能的。您可以使用该IBinder接口动态绑定到队列,但您将没有触发机制。

基本上,如果您想要触发器,则必须对输入队列名称进行硬编码。对于输出,您可以使用前面提到的接口。

这是一个示例IBinder。该示例动态绑定 blob,但您可以对队列执行非常类似的操作。

于 2014-03-28T19:51:41.387 回答