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



我创建了一个 ASP.Net Web API 项目并使用此链接。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;
                });
         ....
       }

从上述任何响应方法最终所有消息最终都会进入错误队列。

以前我收到"无法登记消息"错误。现在它没有抛出该错误。但服务器无法向客户端发送消息。

无法理解我做错了什么。如果您看到任何改进的余地,也请提出建议。

我不确定TransactionScope是否可以在C#中与async/await正常工作。根据这个问题(获取事务范围以与async/await一起使用)在.NET 4.5.1中引入了TransactionScope选项,可以将其与async/await混合使用。不幸的是,NServiceBus 不支持 .NET 4.5/4.5.1,因此请尝试删除 async/await。

最新更新