Asp.net mvc 在NServiceBus中,全双工应用服务器无法发送/回复/返回消息

Asp.net mvc 在NServiceBus中,全双工应用服务器无法发送/回复/返回消息,asp.net-mvc,asynchronous,asp.net-web-api,msmq,nservicebus,Asp.net Mvc,Asynchronous,Asp.net Web Api,Msmq,Nservicebus,我已经创建了一个ASP.NETWebAPI项目并使用它。NServiceBus与web api集成。下面是我作为客户机在WebAPI上的配置 Configure.Serialization.Xml(); Configure.Transactions.Enable(); Configure.With() .DefineEndpointName(Constants.ClientName) .Defaul

我已经创建了一个ASP.NETWebAPI项目并使用它。NServiceBus与web api集成。下面是我作为客户机在WebAPI上的配置

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

        Configure.With()
            .DefineEndpointName(Constants.ClientName)
            .DefaultBuilder()
            .ForWebApi()
            .Log4Net()
            .UseTransport<Msmq>()
            .PurgeOnStartup(false)
            .UnicastBus()
            .ImpersonateSender(false)
            .CreateBus()
            .Start();
Configure.Serialization.Xml();
Configure.Transactions.Enable();
用()配置
.DefineEndpointName(常量.ClientName)
.DefaultBuilder()
.ForWebApi()
.Log4Net()
.UseTransport()
.PurgeOnStartup(错误)
.UnicastBus()
.ImpersonateSender(错误)
.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;
            });
var response=wait Bus.Send(Constants.ServerName,request)
.寄存器((NServiceBus.CompletionResult CompletionResult)=>
{
ResponseModel responseMessage=null;
if(completionResult!=null&&completionResult.Messages.Length>0)
{
var status=completionResult.Messages[0]作为RequestStatus?;
if(status==RequestStatus.Successful)
{
responseMessage=TransactionManager.TransactionDictionary[request.RequestId].ResponseModel;
}
}
返回响应消息;
});
这就是我从服务器发送响应的方式。我已经对一些行进行了注释,以显示我已经尝试过的内容

    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;
                });
         ....
       }
公共无效句柄(RequestModel消息)
{
ProcessRequest(message).RunSynchronously();
}
专用异步任务ProcessRequest(RequestModel消息)
{
....
ResponseModel response=新的ResponseModel();
response.RequestId=message.RequestId;
response.Result=await responseMessage.Content.ReadAsStringAsync();
//发送(Util.Constants.ClientName,response);
//答复(应答);
//总线应答((应答模式应答)=>
//{
//response=Bus.CreateInstance(r=>
//    {
//r.RequestId=message.RequestId;
//r.Result=responseMessage.Content.ReadAsStringAsync().Result;
//    });
//});
等待总线发送(Util.Constants.ClientName,response).Register((NServiceBus.CompletionResult CompletionResult)=>
{
if(completionResult!=null&&completionResult.Messages.Length>0)
{
var msg=completionResult.Messages[0];
如果(msg!=null)
{
var status=(RequestStatus)msg;
返回状态;
}
}
返回RequestStatus.Error;
});
....
}
从上述任何一种响应方法中,所有消息最终都会进入错误队列

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


我不能理解我做错了什么。还请建议您是否有改进的余地。

我不确定TransactionScope是否能正确使用C#中的async/Wait。根据.NET4.5.1中的这个问题(),为TransactionScope引入了一个选项,使其能够与async/await混合使用。不幸的是,NServiceBus不支持.NET 4.5/4.5.1,所以请尝试删除async/await。

感谢Slawomir的快速回复。我关心的不是在客户端接收响应,但我无法理解的是,为什么服务器消息处理程序类中的任何响应或发送方法都无法登记消息或将消息发送到客户端msmq。当我向服务器发送请求消息时,它应该在客户端正常工作。我明白你的意思了。我将响应/发送代码从异步方法移动到处理程序,它开始工作。谢谢斯拉沃米尔·罗西克。