2014-03-25 61 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