【问题标题】:In NServiceBus full duplex application Server could not send/reply/return message在 NServiceBus 全双工应用程序中服务器无法发送/回复/返回消息
【发布时间】:2013-12-19 03:21:20
【问题描述】:

我创建了一个 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;
                });
         ....
       }

通过上述任何一种响应方法,最终所有消息都会进入错误队列。

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

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

【问题讨论】:

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


    【解决方案1】:

    我不确定 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。

    【讨论】:

    • 感谢 Slawomir 的快速回复。我关心的不是客户端的接收响应,而是我无法理解的是为什么来自服务器消息处理程序类的任何响应或发送方法都无法登记或发送消息到客户端 msmq。当我将请求消息发送到服务器时,它通常应该在客户端工作。
    • 我明白你的意思。我将响应/发送代码从异步方法移动到处理程序,它开始工作。谢谢 Slawomir Rosiek。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多