2014-03-25 33 views
1

我有一个MSMQ触发器,它打开一个独立的可执行文件。规则操作将消息ID(作为变体)作为调用参数传递。然后我使用消息ID通过Queue.ReceiveById()接收消息。MSMQ消息ID(作为变体)

一切工作正常,但有一点抓住。消息ID发送这样的:

{5EADA58F-C733-48C3-A52A-A9FA749E7ADF}\2063 

但Queue.ReceiveById()函数需要消息ID看起来像这样(不带括号)

5EADA58F-C733-48C3-A52A-A9FA749E7ADF\2063 

有人能向我解释什么花括号是什么意思?有没有适当的方式来转换(除去括号)?

编辑:我要明确的是,消息ID被作为字符串传递,因为它是被作为命令行参数的EXE

+1

消息ID是一个GUID。这是一个GUID格式。一种方法是使用.ToString()方法,给它一个值,用于返回没有大括号的值。在这种情况下,它将是“D”:http://msdn.microsoft.com/en-us/library/97af8hh4(v=vs.110).aspx –

+0

@Ahmedilyas消息ID是字符串类型,所以我应该先将其解析为Guid,对吗?当我尝试Guid.Parse(...)时,会引发FormatException。我会绕过更多 - 你的评论绝对有帮助! – brudert

回答

2

ID是一个GUID加附加标识符:

该标识符是由20个字节,并包括两个项目:发送的机器的Guid计算机和计算机上消息的唯一标识符。这两项的组合 会生成一个在网络上唯一的消息标识符。

所以没有我所知道的内置解析/重新格式化功能。

如果你想“解析”字符串的GUID部分重新格式化,你可以不要做这样的事情:

string id = @"{5EADA58F-C733-48C3-A52A-A9FA749E7ADF}\2063"; 
string[] parts = id.Split('\\'); 
Guid g = Guid.Parse(parts[0]); 
string newID = String.Join("\\",g.ToString("D").ToUpper(),parts[1]); 

您可能会发现更多的“高雅”,但似乎重去除一些大括号。

+0

完美!那么,Queue.ReceiveById(http://msdn.microsoft.com/en-us/library/0t877y0k(v=vs.110).aspx)是否不接受带大括号的字符串?或者我错过了什么? – brudert

+0

我的猜测是因为ID作为字符串进行比较而不是Guid(因为它是一个Guid加上一些额外的数据)。 –

1

转换为字符串传递,并与空更换支架字符串。

下面是一个代码样品

var x = "{5EADA58F-C733-48C3-A52A-A9FA749E7ADF}\2063"; 
    string result = x.ToString().Replace("{",string.Empty).Replace("}",string.Empty); 
+0

感谢您的回应,AJ。这几乎是我现在所做的。我希望有一个更优雅的解决方案,但我现在想? – brudert