2013-09-23 14 views
1

我有一個要求,可以動態設置通過MSMQ運行的WCF服務的事務超時。我正在關注MSDN上的示例:http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.channeldispatcher.transactiontimeout.aspx。但是,我設置的超時似乎沒有工作。如何動態設置WCF服務的TransactionTimeout?

,我使用設置TransactionTimeout屬性的代碼如下:

ServiceProperties properties = ...; // has a TransactionTimeout value for the service 
var serviceHost = new ServiceHost(...); 
serviceHost.Open(); 
var channelDispatchers = 
    serviceHost.ChannelDispatchers.Select(
     cd => new ChannelDispatcher(cd.Listener)).ToArray(); 
foreach (var channelDispatcher in channelDispatchers) 
{ 
    channelDispatcher.TransactionTimeout = properties.TransactionTimeout; 
} 

當我跑我的服務,把一個2分鐘的延遲在我服務的實現,我收到一個事務登記錯誤當我嘗試寫另一個MSMQ隊列:

例外:在發送到隊列時發生錯誤:指定的 交易不能入伍。 (-1072824232, 0xc00e0058)。確保MSMQ已安裝並正在運行。如果您將 發送到本地隊列,請確保該隊列存在所需的訪問模式和授權 。

有沒有人能夠得到這個工作在過去?任何想法將不勝感激。

預先感謝您。

+0

的第一個想法:檢查MSMQ和MS DTC服務在所有參與的系統上運行;同時檢查隊列上的訪問權限,以確定您的服務正在運行的用戶具有所需的讀/寫權限。 –

+0

一切都在本地運行。權限是正確的。 –

回答

0

我想出了正確的方法。要做到這一點,正確的方法是找到並修改連接到服務描述ServiceBehaviorAttribute對象:

var transactionTimeout = TimeSpan.FromSeconds(...); 
var behavior = serviceHost.Description.Behaviors.Find<ServiceBehaviorAttribute>(); 
behavior.TransactionTimeout = transactionTimeout.ToString(); 
serviceHost.Open();