2016-05-14 109 views
1

当使用ServiceStack将消息发送到Redis时,框架会添加所有标准标头(Priority,CreatedDate,...)。但是,是否可以将任何自定义标题添加到该消息?我有一组微型服务可以相互传递消息,我想包含一个共享标题。是否可以将自定义标题添加到ServiceStack Redis消息中?

到目前为止,我已经探索实施我自己的即时聊天或IMessageFactory的版本,我已经在IOC容器boostrapping当内RedisMqServer看着不同的属性,但我还没有找到任何地方,我可以添加一个新的头。

在此先感谢!

回答

2

您可以使用IMessage.Tag发送任何用户定义的标记文本,如:

using (var mqClient = mqServer.CreateMessageQueueClient()) 
{ 
    mqClient.Publish(new Message<HelloIntro>(new Hello { Name = "World" }) { 
     Tag = "Custom" 
    }); 
} 

否则,我刚刚添加发送自定义页眉in this commit现在也将让你在新的发送自定义页眉支持IMessage.Meta串词典,如:

using (var mqClient = mqServer.CreateMessageQueueClient()) 
{ 
    mqClient.Publish(new Message<HelloIntro>(new Hello { Name = "World" }) { 
     Meta = new Dictionary<string, string> { { "Custom", "Header" } } 
    }); 
} 

,你可以在你的MQ RegisterHandler访问,如:

mqServer.RegisterHandler<Hello>(m => 
    new Message<HelloResponse>(new HelloResponse { 
     Result = "Hello, {0}!".Fmt(m.GetBody().Name) 
    }) { 
     Meta = m.Meta 
    }); 

您的MQ处理程序现在也可以返回IMessage响应,该响应允许完全往返任何自定义标头。

此更改从v4.0.57开始,现在是available on MyGet

+0

Thanks @mythz!我一定要升级到最新版本的ServiceStack并利用Meta属性!感谢您在如此短的时间内执行此操作!我能够很好地将标签传递给Redis。现在,就消费而言......我可以通过'GlobalMessageRequestFilters'访问它吗?否则,我将如何访问它,而不必在每个处理程序的'RegisterHandler'上获取它?我也问的原因是,我的处理程序设置为:'message_server.RegisterHandler (ServiceController.ExecuteMessage);'再次感谢! – napo

+1

@napo您需要将'IRequest'强制转换为'BasicRequest'来访问'BasicRequest.Message'属性。 – mythz

+0

!谢谢,这就是诀窍!我试图将它作为IMessage/Message进行投放,并且无法从中获取任何内容。现在我能够得到它 - 完美!现在,最后一个问题......是否有一种方法可以将标记添加到每条消息中,所以我不必将其明确地添加到我构建的每条消息中?再次感谢! – napo

相关问题