Azure 如何为web作业处理提供基于配置的队列名称?

Azure 如何为web作业处理提供基于配置的队列名称?,azure,azureservicebus,azure-webjobs,Azure,Azureservicebus,Azure Webjobs,我有一个webjob应用程序来处理ServiceBus队列,该队列运行良好,方法如下: public static void ProcessQueueMessage([ServiceBusTrigger("myQueueName")] BrokeredMessage message, TextWriter log) 但是,我希望能够在不重新编译的情况下更改队列名称,例如,根据配置appsetting,可以这样做吗?是的,您可以这样做。您可以在meresolver中实现自己的并将其设置为JobH

我有一个webjob应用程序来处理ServiceBus队列,该队列运行良好,方法如下:

public static void ProcessQueueMessage([ServiceBusTrigger("myQueueName")] BrokeredMessage message, TextWriter log)

但是,我希望能够在不重新编译的情况下更改队列名称,例如,根据配置appsetting,可以这样做吗?

是的,您可以这样做。您可以在meresolver中实现自己的并将其设置为JobHostConfiguration.namesolver。然后,您可以在我们的ServiceBusTrigger属性中使用队列名称,如%myqueue%——运行时将调用您的INameResolver来解析该%myqeuue%变量——您可以使用您想要解析名称的任何自定义代码。您可以从应用程序设置等处阅读它。

我发现了一个INameResolver的实现,它使用的是来自的配置设置

//
///解析配置文件中属性值中的%name%变量。
/// 
公共类ConfigNameResolver:Inamesolver
{
/// 
///将%name%解析为confi文件中的值。解析不是递归的。
/// 
///要解析的名称(不带%…%)
/// 
///如果名称受支持,则名称解析为的值;否则抛出。
/// 
///未在配置文件中找到,或其值为空。
公共字符串解析(字符串名称)
{
var resolvedName=CloudConfigurationManager.GetSetting(名称);
if(string.IsNullOrWhiteSpace(resolvedName))
{
抛出新的InvalidOperationException(“无法解析”+名称);
}
返回resolvedName;
}
}

您不能这样做。但是,您可以更改正在读取的队列,因为您在appSettings中有一个密钥。或者,您可以通过编程方式创建一个新队列,并向其中添加任何消息,而无需重新编译。检查这篇参考文章:这就解决了问题,起初我不知道需要%占位符,并尝试使用其他占位符,如{myqueue},然后用占位符解析名称,但随后按照建议重试,结果很好:)
/// <summary>
/// Resolves %name% variables in attribute values from the config file.
/// </summary>
public class ConfigNameResolver : INameResolver
{
    /// <summary>
    /// Resolve a %name% to a value from the confi file. Resolution is not recursive.
    /// </summary>
    /// <param name="name">The name to resolve (without the %... %)</param>
    /// <returns>
    /// The value to which the name resolves, if the name is supported; otherwise throw an <see cref="InvalidOperationException"/>.
    /// </returns>
    /// <exception cref="InvalidOperationException"><paramref name="name"/>has not been found in the config file or its value is empty.</exception>
    public string Resolve(string name)
    {
        var resolvedName = CloudConfigurationManager.GetSetting(name);
        if (string.IsNullOrWhiteSpace(resolvedName))
        {
            throw new InvalidOperationException("Cannot resolve " + name);
        }

        return resolvedName;
    }
}