我创建了一个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;
});
....
}
从上述任何一种响应方法中,最终所有消息都以错误队列结束。
之前我收到'无法登记邮件'错误。现在它不会抛出那个错误。但是服务器无法向客户发送消息。
我无法得到我做错的事。如果您认为有任何改进余地,请同时建议。
答案 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。