2015-12-01 22 views
2

我們遇到新版本(異步)版本的舊版本不存在的Rebus問題。Rebus,從異步處理程序創建AppDomain/Instance時的例外

當處理rebus消息並嘗試創建AppDomain和Instance以動態運行插件代碼時,它總是給我一個例外。 爲了讓這個例子儘可能簡單,我做了一個測試方法:

public static void Test() 
{ 
    AppDomain ad = AppDomain.CreateDomain("Test"); 
    Loader loader = (Loader)ad.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName); 
} 

class Loader : MarshalByRefObject 
{ 
} 

當我打電話從「正常」的代碼,它的工作方法,但是當我從(異步)滷麪消息稱它把手的方法,它提供了一個異常:

System.Runtime.Serialization.SerializationException被抓住
的HResult = -2146233076消息=類型 'Rebus.Transport.DefaultTransactionContext' 在組件「滷麪, 版本= 1.0。 0.0,Culture = neutral,PublicKeyToken = null'未標記爲 作爲可序列化。 Source = mscorlib StackTrace: at System.AppDomain.CreateInstanceAndUnwrap(String assemblyName,String typeName) at App.Bus.MessageParse.Process.Test()in d:\ Project \ App.Bus.MessageParser \ Process.cs:line 45 在App.Bus.MessageParse.Process.d__0.MoveNext()在d:\項目\ App.Bus.MessageParser \ Process.cs:第28行的InnerException:

有關該問題的任何想法?

回答

2

滷麪存儲在AmbientTransactionContext.Current其事務上下文,這是由線程的邏輯調用上下文,它會自動流向延續,當你await一些支持。

它流向創建應用程序域以及,明顯;)

可以標記DefaultTransactionContext爲可序列化,但我擔心,你會然後就得到一個異常告訴你的是,在事務上下文的字典項不可序列化。

我無法使事務上下文真正可序列化並保證它可以工作,因此 - 如果您需要在消息處理程序中創建一個appdomain - 我建議您暫時刪除環境事務上下文 - 只要記住把它放回去再次:)

類似下面應該做的伎倆:

public async Task Handle(SomeMessage message) 
{ 
    var transactionContext = AmbientTransactionContext.Current; 
    AmbientTransactionContext.Current = null; 
    try 
    { 
     JuggleWithAppDomainsInHere(); 
    } 
    finally 
    { 
     AmbientTransactionContext.Current = transactionContext; 
    } 
} 

如果它在你的應用程序的通用模式,你做的東西與AppDomain的,我建議你換了「消除和 - 環境中的Rebus交易「的東西IDisposable,所以你可以

using(new DismantleAmbientRebusStuff()) 
{ 
    JuggleWithAppDomainsInHere(); 
} 
+0

哇,謝謝!!!我會在30分鐘內自殺,你真的救了我的一天! :) –

+1

請不要自殺:) – mookid8000