2012-05-07 81 views
1

我正在用MassTransit玩一個簡單的例子,我不知道我做錯了什麼,因爲我沒有收到正確的數據。 我在HomeController的用下面的代碼一個簡單的asp.net-MVC應用程序Masstransit沒有處理正確的值

public class TweetCreatedCommand : Command 
{ 
    public readonly string Message; 
    public readonly DateTime Timestamp; 
    public readonly Guid TweetId; 
    public readonly string Who; 

    public TweetCreatedCommand(Guid tweetId, string message, DateTime timeStamp, string who) 
    { 
     TweetId = tweetId; 
     Message = message; 
     Timestamp = timeStamp; 
     Who = who; 
    } 
} 

public ActionResult Index() 
    { 
     TweetCreatedCommand data; 

     Bus.Initialize(sbc => 
     { 
      sbc.UseMsmq(); 
      sbc.VerifyMsmqConfiguration(); 
      sbc.UseMulticastSubscriptionClient(); 
      sbc.ReceiveFrom("msmq://localhost/test_queue"); 
      sbc.Subscribe(subs => 
      { 
       subs.Handler<TweetCreatedCommand>(msg => data = new TweetCreatedCommand(msg.TweetId, msg.Message,msg.Timestamp,msg.Who)); 
      }); 
     }); 

     Bus.Instance.Publish(new TweetCreatedCommand(Guid.NewGuid(),"foo!",DateTime.Now,"CDA")); 

        ViewData.Model = data; 

     return View(); 
    } 

如果我調試代碼,我可以看到TweetCreatedCommand是如何公佈,並在MSMQ隊列中的數據是確定的,但當處理程序收到數據時: TweetCreatedCommand.TweetId是:00000000-0000-0000-0000-000000000000它應該是其他東西 TweetCreatedCommand.Message爲空,它應該是「foo!」 TweetCreatedCommand.TimeStamp是01/01/01 誰是空,它應該是「CDA」

什麼是錯?

任何幫助,將不勝感激

回答

1

MassTransit的默認序列化僅適用於屬性。嘗試將只讀字段更改爲屬性,並且序列化程序應正確填充數據。如果只需要只讀字段,請更改爲BinarySerializer(默認爲JSON)。

+0

非常感謝你,現在它完美地改變只讀字段 – cdiazal

+0

如果我嘗試使用UseBinarySerializer它不工作。它在發佈時調用TweetCreatedCommand構造函數,但它在發佈之後不再調用構造函數,因此變量數據爲空。 – cdiazal

+0

將其列入郵件列表:https://groups.google.com/forum/#!forum/masstransit-discuss;我沒有任何理由使用過BinarySerializer,我確信周圍還有一些額外的陷阱,只是想不到。此外,請查看規格:https://github.com/MassTransit/MassTransit/tree/master/src/MassTransit.Tests/Serialization大部分隨後針對每個序列化程序運行。 – Travis