我创建了一个 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。