使用MassTransit时IIS会冻结

时间:2012-04-04 21:32:17

标签: .net iis msmq servicebus masstransit

我们在Web应用程序的请求/响应模型中使用MassTransit。我们能够发送请求并接收回复。用于测试/调试目的我们将响应处理程序上的HandleTimeOut设置为1小时。问题是当服务器无法发送响应时,我无法在客户端执行任何操作(我无法访问任何其他页面)。在重置IIS之前,应用程序服务器不响应来自浏览器的任何其他请求。这是预期的行为吗?如果可以的话可以解释为什么IIS没有响应任何其他页面请求以及是否有办法改变这种行为。

我正在autofac模块中注册总线

builder.Register(c => ServiceBusFactory.New(sbc =>
        {
            sbc.UseMsmq();
            sbc.VerifyMsDtcConfiguration();
            sbc.VerifyMsmqConfiguration();
            sbc.ReceiveFrom("msmq://localhost/MassTransit_ClientQueue");
            sbc.UseBinarySerializer();
            sbc.SetCreateTransactionalQueues(false);
        })).As<IServiceBus>().SingletonScoped();

我的客户端代码如下所示

var bus = IoC.Resolve<IServiceBus>();
bus.GetEndpoint(new Uri("msmq://localhost/MassTransit_ServerQueue"))
                        .SendRequest(new Message(), bus, rc =>
                        {
                            rc.HandleTimeout(new TimeSpan(1, 0, 0),
                                () => { });
                            rc.Handle<MessageResponse>(resmess =>
                            {

                            });
                            rc.Handle<MassTransit.Fault<Message>>
                                (resmess =>
                                    {

                                    });
                        });

2 个答案:

答案 0 :(得分:3)

原因是您的ASP.Net Web应用程序的用户基本上序列化了对您的Web应用程序的访问 - 除非您调用自定义HttpHandler,否则您无法在ASP.Net中为单个用户会话ID进行并行请求没有实现接口IRequiresSessionState

因此,如果您没有收到回复,并等待一小时的超时,那么您将无法为该应用程序域的那个小时为该用户提出更多的http请求,直到您绑定的主题为止等待消息已超时。

答案 1 :(得分:0)

这可能是由于MassTransit未配置为一次处理多条消息。

http://readthedocs.org/docs/masstransit/en/latest/configuration/config_api.html#bus-tuning-options

ServiceBusFactory.New(sbc =>
{
  //...
  sbc.SetConcurrentConsumerLimit(5); //try setting this to a larger number.
  //...
});