我有一个ASP.NET 4.7.2应用程序,目前还无法迁移到新的.NET版本。
现在我们使用的是Masstransit 6.3.2。
结果是,我们在我的Global.asax.cs
:中创建了一个这样的总线
busControl = Bus.Factory.CreateUsingRabbitMq((cfg) =>
{
cfg.Host(_settings.Host, _settings.VirtualHost, hfg =>
{
hfg.Password(_settings.Password);
hfg.Username(_settings.UserName);
});
});
container.RegisterInstance<IBusControl>(busControl);
container.RegisterInstance<IBus>(busControl);
总线被传递到容器(IUnityContainer
(并注入控制器:
[RoutePrefix("api/Message")]
public class MessageController : ApiController
{
private readonly IBus bus;
public MessageController(IBus bus)
{
this.bus = bus;
}
[HttpPost()]
[ResponseType(typeof(void))]
[Route(nameof(SendTestMessage))]
public async Task<IHttpActionResult> SendTestMessage(TestMessage message)
{
if (message == null)
return BadRequest();
try
{
var endpoint = await bus.GetSendEndpoint(new Uri("exchange:testQueue"));
await endpoint.Send(message);
return Ok();
}
catch (Exception ex)
{
Logger.Fatal(ex, "HttpRequest {requestname} failed", nameof(SendTestMessage));
return StatusCode(HttpStatusCode.InternalServerError);
}
}
}
第一次调用该操作时,一切正常,并将消息传递到RabbitMq队列。在第二次尝试时,它失败,并出现异常。
该异常不存在堆栈争用。异常的来源是System.Web
。
System.NullReferenceException
HResult=0x80004003
Message=对象引用未设置为对象实例
此异常最初是在以下调用堆栈引发的:
System.Web.ThreadContext.AssociateWithCurrentThread(bool(
所以修复非常容易。
我刚换了
var endpoint = await bus.GetSendEndpoint(new Uri("exchange:testQueue"));
至
var endpoint = await bus.GetSendEndpoint(new Uri("exchange:testQueue")).ConfigureAwait(false);