Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从QueueClient.OnMessage回调内部获取队列名称_C#_Azure_Azureservicebus_Azure Servicebus Queues - Fatal编程技术网

C# 从QueueClient.OnMessage回调内部获取队列名称

C# 从QueueClient.OnMessage回调内部获取队列名称,c#,azure,azureservicebus,azure-servicebus-queues,C#,Azure,Azureservicebus,Azure Servicebus Queues,将回调,操作,作为一个参数,当消息可用时,该参数将由不断轮询队列(或订阅)的内部消息泵执行 我一直在查看Reflector中的BrokeredMessage类型,但找不到从BrokeredMessage对象获取消息的队列名称(最后一部分是关键)。如果这是可能的,如何将其拔出?最终通过反射找到了解决方案: public void OnMessageCallback(BrokeredMessage message) { var context = message.GetType().GetP

将回调,
操作
,作为一个参数,当消息可用时,该参数将由不断轮询队列(或订阅)的内部消息泵执行


我一直在查看Reflector中的BrokeredMessage类型,但找不到从BrokeredMessage对象获取消息的队列名称(最后一部分是关键)。如果这是可能的,如何将其拔出?

最终通过反射找到了解决方案:

public void OnMessageCallback(BrokeredMessage message) {
    var context = message.GetType().GetProperty("ReceiveContext", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(message);
    var receiver = (MessageReceiver)context.GetType().GetProperty("MessageReceiver", BindingFlags.Public | BindingFlags.Instance).GetValue(context);
    var queueName = receiver.Path;
}

最终通过反射找到了一个解决方案:

public void OnMessageCallback(BrokeredMessage message) {
    var context = message.GetType().GetProperty("ReceiveContext", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(message);
    var receiver = (MessageReceiver)context.GetType().GetProperty("MessageReceiver", BindingFlags.Public | BindingFlags.Instance).GetValue(context);
    var queueName = receiver.Path;
}

如果您使用的是
QueueClient.OnMessage
,则可以执行以下操作:

var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{

    // You always have access to the queue path
    var queueName = client.Path;
});
var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{
    ProcessMessage(message , client.Path);
});
如果不想使用匿名函数,可以将queueName传递给要处理消息的函数:

public void ProcessMessage(BrokeredMessage message, string queueName)
{

}
并这样称呼你:

var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{

    // You always have access to the queue path
    var queueName = client.Path;
});
var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{
    ProcessMessage(message , client.Path);
});
编辑:使用

Azure ServiceBus SDK提供了从队列或订阅接收消息的抽象:

var messagingFactory = MessagingFactory.CreateFromConnectionString("MyConnectionString");
var messageReceiver = messagingFactory.CreateMessageReceiver("MyQueueName");
messageReceiver.OnMessage(message =>
{

    // You always have access to the queue path
    var queueName = messageReceiver.Path;
}, new OnMessageOptions());

如果您使用的是
QueueClient.OnMessage
,则可以执行以下操作:

var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{

    // You always have access to the queue path
    var queueName = client.Path;
});
var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{
    ProcessMessage(message , client.Path);
});
如果不想使用匿名函数,可以将queueName传递给要处理消息的函数:

public void ProcessMessage(BrokeredMessage message, string queueName)
{

}
并这样称呼你:

var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{

    // You always have access to the queue path
    var queueName = client.Path;
});
var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{
    ProcessMessage(message , client.Path);
});
编辑:使用

Azure ServiceBus SDK提供了从队列或订阅接收消息的抽象:

var messagingFactory = MessagingFactory.CreateFromConnectionString("MyConnectionString");
var messageReceiver = messagingFactory.CreateMessageReceiver("MyQueueName");
messageReceiver.OnMessage(message =>
{

    // You always have access to the queue path
    var queueName = messageReceiver.Path;
}, new OnMessageOptions());

当您不想区分队列和订阅时,这将不起作用。例如,当使用MessageReceiver.OnMessage时,这将不起作用。将此代码转换为MessageReceiver非常简单。消息接收器还有一个Path属性。很遗憾,我无法从回调中访问QueueClient对象。这就是我强调需要从BrokeredMessage参数(或某些静态方法)获取它的主要原因。当您不想区分队列和订阅时,这不会有帮助。例如,当使用MessageReceiver.OnMessage时,这将不起作用。将此代码转换为MessageReceiver非常简单。消息接收器还有一个Path属性。很遗憾,我无法从回调中访问QueueClient对象。这就是我强调需要从BrokeredMessage参数(或一些静态方法)获取它的主要原因。如果
MessageReceiver
的内部发生更改,反射可能会中断。您能否详细说明需要识别实体消息的来源?请注意,对于活动,您将获得主题,但不会获得订阅。嗨,SeanFeldman,谢谢您的回复。我可以在ASB的发送方和消费者方记录信息。我希望能够记录足够多的信息,以便将收到的任何消息与发送者联系起来。我认为这需要我知道端点地址和消息的序列号(可能是InternalId?或CorrelationId?或者MessageId是否足够?我不确定)。因此,对于我想做的事情,只访问主题,而不访问来自消费者的订阅,可能是可以的。我欢迎任何想法!记录信息确实会有帮助,因为这样信息就会与消息一起存储(在标题中)。就像正在转发的消息一样,消息头中也包含信息。我建议,一旦你陷入这样的复杂性,就研究一下NServiceBus或MassTransit之类的东西,并在样板代码上花费大量精力。如果
MessageReceiver
的内部结构发生变化,反射可能会中断。您能否详细说明需要识别实体消息的来源?请注意,对于活动,您将获得主题,但不会获得订阅。嗨,SeanFeldman,谢谢您的回复。我可以在ASB的发送方和消费者方记录信息。我希望能够记录足够多的信息,以便将收到的任何消息与发送者联系起来。我认为这需要我知道端点地址和消息的序列号(可能是InternalId?或CorrelationId?或者MessageId是否足够?我不确定)。因此,对于我想做的事情,只访问主题,而不访问来自消费者的订阅,可能是可以的。我欢迎任何想法!记录信息确实会有帮助,因为这样信息就会与消息一起存储(在标题中)。就像正在转发的消息一样,消息头中也包含信息。我建议,一旦您陷入这样的复杂性并在样板代码上花费大量精力时,可以研究一下NServiceBus或MassTransit之类的东西。