2013-02-10 84 views
1

,我有以下方法在API控制器的Web API CurrentMessageContext空

[System.Web.Mvc.HttpPost] 
public Task<CommandResponse> Send(CommandBase command) 
{ 
    var result = new TaskCompletionSource<CommandResponse>(); 

    this.Bus.Send(command).Register<int>(response => 
     { 
      this.Bus.CurrentMessageContext is here null <------- 
      result.TrySetResult(commandResponse); 
     }); 
    return result.Task; 
} 

任何想法,为什么CurrentMessageContext在这里空。我正在关注请求/响应示例。这里唯一的区别是使用Task的异步模式。

感谢, Marinko

+0

你试图在消息上下文中访问什么? – 2013-02-10 20:26:01

+0

发送响应之前设置的标头 – 2013-02-11 21:39:50

+0

如果您不使用任务,会发生什么情况? – 2013-02-11 23:59:25

回答

0

由于AsyncPagesMVC3样品中,你必须明确地调用安装功能,请参阅在的Application_Start()方法的最后一行从Global.asax.cs中:

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     // NServiceBus configuration 
     Configure.WithWeb() 
      .DefaultBuilder() 
      .ForMvc() 
      .JsonSerializer() 
      .Log4Net() 
      .MsmqTransport() 
       .IsTransactional(false) 
       .PurgeOnStartup(true) 
      .UnicastBus() 
       .ImpersonateSender(false) 
      .CreateBus() 
      .Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install()); 
    } 
+0

回调按预期执行。安装方法没有帮助。我想访问回调中的this.Bus.CurrentMessageContext.Headers。我认为这个问题与线程有关。工作线程与回调线程不一样,但我不确定。 – 2013-02-12 08:02:46

2

回调在另一个线程中被触发,因为Bus.CurrentMessageContext使用ThreadStatic属性,如果从不同的线程访问,该值为空。

+0

我遇到了这样的问题,我得到了和你一样的结论。你有什么建议来解决这个问题吗?我只能想到移除所有异步内容或等待NSB 6。 – 2016-02-02 15:40:56