C# 如何动态设置WCF服务的TransactionTimeout?

C# 如何动态设置WCF服务的TransactionTimeout?,c#,wcf,msmq,transactionscope,netmsmqbinding,C#,Wcf,Msmq,Transactionscope,Netmsmqbinding,我需要能够动态地设置通过MSMQ运行的WCF服务的事务超时。我遵循MSDN上的示例:。但是,我正在设置的超时似乎不起作用 我用来设置TransactionTimeout属性的代码如下: ServiceProperties properties = ...; // has a TransactionTimeout value for the service var serviceHost = new ServiceHost(...); serviceHost.Open(); var channel

我需要能够动态地设置通过MSMQ运行的WCF服务的事务超时。我遵循MSDN上的示例:。但是,我正在设置的超时似乎不起作用

我用来设置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已安装并正在运行。如果你是 发送到本地队列时,请确保该队列具有所需的 访问模式和授权

过去有没有人能让它起作用?任何想法都将不胜感激


提前谢谢。

我找到了正确的方法。正确的方法是查找并修改附加到服务描述的ServiceBehaviorAttribute对象:

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

第一个想法:检查MSMQ和MS DTC服务是否在所有参与系统上运行;同时检查队列上的访问权限,运行服务的用户具有所需的读/写权限。所有内容都在本地运行。权限是正确的。