1

我需要能够为在 MSMQ 上运行的 WCF 服务动态设置事务超时。我正在关注 MSDN 上的示例:http: //msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.channeldispatcher.transactiontimeout.aspx。但是,我设置的超时似乎不起作用。

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

过去有没有人能让这个工作?任何想法将不胜感激。

先感谢您。

4

1 回答 1

0

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

var transactionTimeout = TimeSpan.FromSeconds(...);
var behavior = serviceHost.Description.Behaviors.Find<ServiceBehaviorAttribute>();
behavior.TransactionTimeout = transactionTimeout.ToString();
serviceHost.Open();
于 2013-10-06T04:37:42.823 回答