C# 在批处理中将消息发送到ServiceBus队列期间发生FaultException

C# 在批处理中将消息发送到ServiceBus队列期间发生FaultException,c#,.net,azureservicebus,servicebus,azure-servicebus-queues,C#,.net,Azureservicebus,Servicebus,Azure Servicebus Queues,我正在尝试批量向服务总线队列发送几条消息。我是用一种方法来做这件事的 在此操作期间,我收到一个故障异常: 批处理具有不同SessionId、PartitionKey或 具有分区和分区的实体不支持MessageId 已启用重复检测 异常的消息是不言自明的,我会尝试修复它,但有时它是有效的,不会抛出异常 所以有时候它抛出一个异常,有时候它工作。我不更改队列的任何设置,也不更改代码 你知道为什么会这样吗?我也有同样的问题,这篇文章帮助了我: 我意识到异常消息实际上是不正确的。它给人的印象是“在启用了

我正在尝试批量向服务总线队列发送几条消息。我是用一种方法来做这件事的

在此操作期间,我收到一个
故障异常

批处理具有不同SessionId、PartitionKey或 具有分区和分区的实体不支持MessageId 已启用重复检测

异常的消息是不言自明的,我会尝试修复它,但有时它是有效的,不会抛出异常

所以有时候它抛出一个异常,有时候它工作。我不更改队列的任何设置,也不更改代码


你知道为什么会这样吗?

我也有同样的问题,这篇文章帮助了我:

我意识到异常消息实际上是不正确的。它给人的印象是“在启用了重复检测的情况下不支持distinct…MessageId”,而实际上它是必需的

因此,在我创建一条消息之后: var message=新消息(Encoding.UTF8.GetBytes())

我添加了这行代码,它起了作用:


message.MessageId=Guid.NewGuid().ToString()

这可能是因为批处理中包含的消息将进入不同的分区。批处理只能包含一个分区的消息。在我的例子中,我的分区是SessionId,所以我首先按SessionId对消息进行分组,然后按这些组进行批处理,效果非常好

var bySessionId = messages.GroupBy(s => s.SessionId);
foreach (var sessionSet in bySessionId)
{
    var msgBatch = sessionSet.Batch(20); //Using .Batch from MoreLinq
    foreach (var b in msgBatch)
    {
        var sbb = await sender.CreateMessageBatchAsync();
        b.ForEach(m => sbb.TryAddMessage(m));

        await sender.SendMessagesAsync(sbb);
    }
}

当它成功时,整个批处理实际上属于同一个会话吗?您可以确认,当它工作时,实体/消息的状态是相同的吗?您是否在传入消息的上下文中发送(“发送通过”)?@Mikhail我们不显式使用会话,它是否可以隐式使用,因为我们缓存并重用QueueClient?@SeanFeldman不确定相同状态的含义,但我们发送的消息仅在特定于域的值上有所不同,我们不为
messageid
partitionkey
sessionid
分配任何值。而且,不,我们不是在传入消息的上下文中发送。@Alexikilinda Ok。。。但是您的队列是否已分区,是否启用了重复检测?