C# 如何更改服务总线队列的属性?

C# 如何更改服务总线队列的属性?,c#,asp.net-mvc,azure,azure-storage,azureservicebus,C#,Asp.net Mvc,Azure,Azure Storage,Azureservicebus,我使用服务总线队列在web角色和工作者角色之间进行通信。有时工作角色不接受web角色消息。但它会立即接受我发送的下一条消息。所以我想这可能是因为批处理操作被启用了。我一直试图把它说成是假的,但我没有成功。这是我的密码 public static QueueClient GetServiceBusQueueClient(string queuename) { string connectionString; if (RoleEnvi

我使用服务总线队列在web角色和工作者角色之间进行通信。有时工作角色不接受web角色消息。但它会立即接受我发送的下一条消息。所以我想这可能是因为批处理操作被启用了。我一直试图把它说成是假的,但我没有成功。这是我的密码

public static QueueClient GetServiceBusQueueClient(string queuename)
    {            
        string connectionString;

        if (RoleEnvironment.IsAvailable)
         connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
        else
            connectionString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"];          


        var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

        QueueDescription queue = null;

        if (!namespaceManager.QueueExists(queuename))
        {
            queue = namespaceManager.CreateQueue(queuename);
            queue.EnableBatchedOperations = false;
            queue.MaxDeliveryCount = 1000;
        }
        else
        {
            queue = namespaceManager.GetQueue(queuename);
            queue.EnableBatchedOperations = false;
            queue.MaxDeliveryCount = 1000;
        }

        MessagingFactorySettings mfs = new MessagingFactorySettings();
        mfs.NetMessagingTransportSettings.BatchFlushInterval = TimeSpan.Zero;

        string issuer;
        string accessKey;
         if (RoleEnvironment.IsAvailable)
            issuer = RoleEnvironment.GetConfigurationSettingValue("AZURE_SERVICEBUS_ISSUER");
         else
             issuer = ConfigurationManager.AppSettings["AZURE_SERVICEBUS_ISSUER"];

        if (RoleEnvironment.IsAvailable)
            accessKey = RoleEnvironment.GetConfigurationSettingValue("AZURE_SERVICEBUS_ACCESS_KEY");
        else
            accessKey = ConfigurationManager.AppSettings["AZURE_SERVICEBUS_ACCESS_KEY"];

        mfs.TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(issuer, accessKey);
        MessagingFactory messagingFactory = MessagingFactory.Create(namespaceManager.Address, mfs);

        QueueClient Client = messagingFactory.CreateQueueClient(queue.Path);            

        return Client;
    }
但是EnableBatchedOperations始终为true,默认情况下MaxDeliveryCount始终为10

如果你知道有什么问题,请告诉我

谢谢

如果要设置EnabledBatchedOperations,必须在创建队列之前进行设置。您可以通过创建QueueDescription对象,然后将其传递给CreateQueue方法来实现这一点。例如:

QueueDescription orderQueueDescription =
    new QueueDescription(queuename)
    {
        RequiresDuplicateDetection = true,
        MaxDeliveryCount = 1000,
    };
namespaceMgr.CreateQueue(orderQueueDescription);
更新: 文件对此非常清楚:

由于创建消息传递实体后无法更改元数据,因此修改重复检测行为需要删除并重新创建队列。同样的原则也适用于任何其他元数据。[1]

QueueDescription表示队列的元数据描述

[1]

如果要设置EnabledBachedOperations,必须在创建队列之前进行设置。您可以通过创建QueueDescription对象,然后将其传递给CreateQueue方法来实现这一点。例如:

QueueDescription orderQueueDescription =
    new QueueDescription(queuename)
    {
        RequiresDuplicateDetection = true,
        MaxDeliveryCount = 1000,
    };
namespaceMgr.CreateQueue(orderQueueDescription);
更新: 文件对此非常清楚:

由于创建消息传递实体后无法更改元数据,因此修改重复检测行为需要删除并重新创建队列。同样的原则也适用于任何其他元数据。[1]

QueueDescription表示队列的元数据描述

[1] 更新Azure SDK 2.3

NamespaceManager上的UpdateQueue方法除了挂起或恢复队列外,仍然不允许更新任何属性

如果您需要更改现有队列上的MaxDeliveryCount,并且不想删除和重新创建队列,那么您唯一的选择就是在Azure门户中更改它。

更新Azure SDK 2.3

NamespaceManager上的UpdateQueue方法除了挂起或恢复队列外,仍然不允许更新任何属性


如果您需要更改现有队列上的MaxDeliveryCount,并且不想删除和重新创建队列,那么您唯一的选择就是在Azure门户中更改它。

还值得补充的是,NamespaceManager上的UpdateQueue操作不允许您更新此属性-您只能在创建队列之前设置它。谢谢!我还需要一件事的帮助。你能确认我将批量刷新间隔设置为零的方法是正确的吗?因为无法确定它是否被设置为零。谢谢again@Bitsian我不知道你说的正确是什么意思。是的,您可以将该值设置为零而不会出错。这样做的目的是禁用批处理。如果这是你想要的,那么你做得对。是的,我想禁用批处理。但是我在创建队列之后设置了批刷新间隔,这就是为什么我问我为它编写的代码是否可以工作的原因。你知道批处理的作用吗?我猜队列客户机将等待收集一些消息以成批发送它们?在我的例子中,消息在第一次发送时没有被接收到。如果我再次发送一条消息,那么这次会收到上一条消息。另外值得补充的是,NamespaceManager上的UpdateQueue操作不允许您更新此属性-您只能在创建队列之前设置它。谢谢!我还需要一件事的帮助。你能确认我将批量刷新间隔设置为零的方法是正确的吗?因为无法确定它是否被设置为零。谢谢again@Bitsian我不知道你说的正确是什么意思。是的,您可以将该值设置为零而不会出错。这样做的目的是禁用批处理。如果这是你想要的,那么你做得对。是的,我想禁用批处理。但是我在创建队列之后设置了批刷新间隔,这就是为什么我问我为它编写的代码是否可以工作的原因。你知道批处理的作用吗?我猜队列客户机将等待收集一些消息以成批发送它们?在我的例子中,消息在第一次发送时没有被接收到。如果我再次发送消息,那么这次会收到上一条消息。我如何在Azure门户中更改它?我的门户中没有该选项…请查看本教程中的屏幕截图,我阅读了您推荐的页面。为了尝试一下,我创建了一个新队列。正如你所说,有一个编辑页面。但在我的例子中,我有一个带有订阅队列的主题。由于某些原因,门户不允许您编辑订阅队列的属性。。。为什么会有锁定限制???我如何在Azure门户中更改它?我的门户中没有该选项…请查看本教程中的屏幕截图,我阅读了您推荐的页面。只是想试试看 我创建了一个新队列。正如你所说,有一个编辑页面。但在我的例子中,我有一个带有订阅队列的主题。由于某些原因,门户不允许您编辑订阅队列的属性。。。为什么会有锁定限制???