在NServiceBus中,全双工应用程序服务器无法发送/回复/返回消息

时间:2013-12-18 18:40:11

标签: asp.net-mvc asynchronous asp.net-web-api msmq nservicebus

我创建了一个ASP.Net Web API项目并使用此link。 NServiceBus与web api集成在一起。这是我在web api上作为客户端的配置。

        Configure.Serialization.Xml();
        Configure.Transactions.Enable();

        Configure.With()
            .DefineEndpointName(Constants.ClientName)
            .DefaultBuilder()
            .ForWebApi()
            .Log4Net()
            .UseTransport<Msmq>()
            .PurgeOnStartup(false)
            .UnicastBus()
            .ImpersonateSender(false)
            .CreateBus()
            .Start();

这就是我向服务器发送消息的方式

         var response = await Bus.Send(Constants.ServerName, request)
            .Register<ResponseModel>((NServiceBus.CompletionResult completionResult) =>
            {
                ResponseModel responseMessage = null;
                if (completionResult != null && completionResult.Messages.Length > 0)
                {
                    var status = completionResult.Messages[0] as RequestStatus?;

                    if (status == RequestStatus.Successful)
                    {
                        responseMessage = TransactionManager.TransactionDictionary[request.RequestId].ResponseModel;
                    }
                }

                return responseMessage;
            });

这就是我从服务器发送响应的方式。我已经评论了一些线条来展示我已经尝试过的东西。

    public void Handle(RequestModel message)
    {
        ProcessRequest(message).RunSynchronously();
    }

    private async Task ProcessRequest(RequestModel message)
    {
        ....
                ResponseModel response = new ResponseModel();
                response.RequestId = message.RequestId;
                response.Result = await responseMessage.Content.ReadAsStringAsync();

                //Bus.Send(Util.Constants.ClientName, response);

                //Bus.Reply(response);

                //Bus.Reply<ResponseModel>((ResponseModel response) => 
                //{
                //    response = Bus.CreateInstance<ResponseModel>(r =>
                //    {
                //        r.RequestId = message.RequestId;
                //        r.Result = responseMessage.Content.ReadAsStringAsync().Result;
                //    });
                //});

                await Bus.Send(Util.Constants.ClientName, response).Register((NServiceBus.CompletionResult completionResult) =>
                {
                    if (completionResult != null && completionResult.Messages.Length > 0)
                    {
                        var msg = completionResult.Messages[0];
                        if (msg != null)
                        {
                            var status = (RequestStatus)msg;
                            return status;
                        }
                    }
                    return RequestStatus.Error;
                });
         ....
       }

从上述任何一种响应方法中,最终所有消息都以错误队列结束。

之前我收到'无法登记邮件'错误。现在它不会抛出那个错误。但是服务器无法向客户发送消息。

我无法得到我做错的事。如果您认为有任何改进余地,请同时建议。

1 个答案:

答案 0 :(得分:3)

我不确定TransactionScope在C#中是否与async / await一起正常工作。根据.NET 4.5.1中的这个问题(Get TransactionScope to work with async / await),为TransactionScope引入了一个选项,可以将它与async / await混合使用。不幸的是,NServiceBus不支持.NET 4.5 / 4.5.1,所以请尝试删除async / await。