我在下面的代码中得到了一个InvalidOperationException。我确信我对autofac IoC和Rebus缺乏了解这个错误。
System.InvalidOperationException未处理
Message =没有可用的消息上下文 - MessageContext实例仅在处理消息期间设置,并且仅在工作线程上可用。
StackTrace的一部分:
at Rebus.MessageContext.GetCurrent()
at Rebus.Autofac.AutofacContainerAdapter.GetHandlerInstancesFor[T]()
at RebusAutofacDemo.Program.Main(String[] args) in c:\RebusAutofacDemo\Program.cs:line 45
[cut]
因此,当我在控制台应用程序中使用以下代码时,我收到上述错误。
class Program
{
static void Main(string[] args)
{
var builder = new Autofac.ContainerBuilder();
builder.RegisterType<MyHandler>();
var container = builder.Build();
var adapter = new AutofacContainerAdapter(container);
var bus = Configure.With(adapter)
.Transport(t => t.UseAzureServiceBus("myConnectionstring", "my_input_queue", "error"))
.CreateBus()
.Start();
adapter.GetHandlerInstancesFor<MyHandler>(); // THIS IS THE LINE WITH THE ERROR
var timer = new System.Timers.Timer();
timer.Elapsed += delegate { bus.SendLocal(new MyMessage{ Body = DateTime.Now.ToString()}); };
timer.Interval = 1000;
timer.Start();
Console.ReadLine();
}
}
public class MyMessage
{
public string Body { get; set; }
}
public class MyHandler : IHandleMessages<MyMessage>
{
private readonly IBus _bus;
public MyHandler(IBus bus)
{
_bus = bus;
}
public void Handle(MyMessage message)
{
Console.WriteLine(message);
}
}
为了完整性,这已被添加到app.config:
<configSections>
<section name="rebus" type="Rebus.Configuration.RebusConfigurationSection, Rebus" />
</configSections>
<rebus inputQueue="my-app.input" errorQueue="my-app.error" workers="1">
<endpoints>
<!-- <add messages="SomeAssembly" endpoint="another-app.input"/> -->
</endpoints>
</rebus>
答案 0 :(得分:2)
您收到错误是因为您正在调用GetHandlerInstances
,这是Rebus在处理邮件时要调用的。
尝试删除该行,然后您就会看到您的邮件已被处理。
PS:MyHandler
必须在容器中注册为IHandleMessages<MyMessage>
的实现 - 我不是Autofac的专家,但我不认为你是在你的代码中做到这一点......?