2016-11-02 1 views
1

Я пытаюсь обновить существующий веб-сайт от Rebus 0.45 до Rebus 2.0 и столкнулся с проблемой, когда System.Web.ThreadContext.AssociateWithCurrentThread сбой с нулевой ссылкой. Я абсолютно не знаю, почему, поэтому я ищу возможные причины, которые я могу искать.Rebus crash в .NET async core

Единственный след у меня есть, журнал событий Windows, который регистрирует следующее при попытке отправить сообщение:

An unhandled exception occurred and the process was terminated. 

Application ID: /LM/W3SVC/1/ROOT/website 

Process ID: 14460 

Exception: System.NullReferenceException 

Message: Object reference not set to an instance of an object. 

StackTrace: at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext) 
    at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state) 
    at System.Web.LegacyAspNetSynchronizationContext.Post(SendOrPostCallback callback, Object state) 
    at System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.PostAction(Object state) 
    at System.Threading.Tasks.AwaitTaskContinuation.RunCallback(ContextCallback callback, Object state, Task& currentTask) 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Threading.Tasks.AwaitTaskContinuation.<>c.<ThrowAsyncIfNecessary>b__18_0(Object s) 
    at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() 

Сайт работает под управлением ASP.NET MVC 3.0 с инжектором зависимостей замок Виндзор и использует Головоломки .SqlServer для установки транспорта как однопанельный клиент:

var busConfigurer = Configure.With(new CastleWindsorContainerAdapter(container)) 
    .Logging(l => l.Use(new RebusLoggerFactory())) 
    .Routing(t => t.TypeBased().AddEndpointMappingsFromAppConfig()) 
    .Subscriptions(s => s.StoreInSqlServer(dbConnectionString, "RebusSubscriptions_v2")) 
    .Transport(t => t.UseSqlServerAsOneWayClient(dbConnectionString, "RebusMessages_v2")) 
    Start(); 

IIS настроен на».NET 4.5" пул приложений.

запускается веб-сайт и журналы шина:

- Supplied connection string will be modified to enable MARS 
- Database already contains a table named 'RebusMessages_v2' - will not create anything 
- Supplied connection string will be modified to enable MARS 
- Starting periodic task 'CleanupTrackedErrors' with interval 00:01:00 
- Starting bus 1 
- Started 

В более позднее время сообщения отправляются через Ребус, вошедшее:

- Sending SubmissionCreatedEvent -> SelfService.Service.input 

... и бум! все приложение аварийно завершает работу.

Перед отправкой сообщения приложение взаимодействует с NHibernate для хранения сведений об операции.

Update

Изменяя Bus.Send(msg) к Bus.Send(msg).Start() я могу вызвать ту же ошибку синхронно и получить следующую трассировку стека при отладке в Visual Studio:

Exception thrown: 'System.NullReferenceException' in System.Web.dll 
Exception thrown: 'System.NullReferenceException' in mscorlib.dll 
System.Transactions Critical: 0 : 
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>/LM/W3SVC/1/ROOT/website-2-131225642632547395</AppDomain> 
<Exception><ExceptionType>System.NullReferenceException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Object reference not set to an instance of an object.</Message><StackTrace> at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext) 
    at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state) 
    at System.Web.LegacyAspNetSynchronizationContext.Post(SendOrPostCallback callback, Object state) 
    at System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.PostAction(Object state) 
    at System.Threading.Tasks.AwaitTaskContinuation.RunCallback(ContextCallback callback, Object state, Task&amp;amp; currentTask) 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Threading.Tasks.AwaitTaskContinuation.&amp;lt;&amp;gt;c.&amp;lt;ThrowAsyncIfNecessary&amp;gt;b__18_0(Object s) 
    at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()</StackTrace><ExceptionString>System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext) 
    at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state) 
    at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state) 
    at System.Web.LegacyAspNetSynchronizationContext.Post(SendOrPostCallback callback, Object state) 
    at System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.PostAction(Object state) 
    at System.Threading.Tasks.AwaitTaskContinuation.RunCallback(ContextCallback callback, Object state, Task&amp;amp; currentTask) 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Threading.Tasks.AwaitTaskContinuation.&amp;lt;&amp;gt;c.&amp;lt;ThrowAsyncIfNecessary&amp;gt;b__18_0(Object s) 
    at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()</ExceptionString></Exception></TraceRecord> 

Update II

Замена Bus.Publish(msg) на bus.Advanced.Routing.Send("SelfService.Service.input", msg) работ. Так что, видимо, в материалах подписки/маршрутизации что-то не так, как Send(...) обходит это.

Update III

Видимо добавление <httpRuntime targetFramework="4.6" ... в web.config решена проблема (до сих пор, все еще кажется немного неустойчивый). Web.config уже <compilation ... targetFramework="4.6">:

<system.web> 
    <httpRuntime targetFramework="4.6" maxRequestLength="5000" requestValidationMode="2.0" /> 
    <compilation debug="true" targetFramework="4.6"> 
     <assemblies>...</assemblies> 
    </compilation> 
    <pages validateRequest="false"> 
     <namespaces>...</namespaces> 
    </pages> 
    </system.web> 
+0

Когда я искал google для «nullreferenceexception onthreadenterprivate», я добрался до [этого другого сообщения SO] (http://stackoverflow.com/questions/12969071/async-logging-throwing-a-nullreferenceexception), который предположил, что это исключение происходит, когда вы забудете «подождать» что-то асинхронное ..... может ли быть так просто, что вы забыли «ждать Bus.Send (yourMessage)»? – mookid8000

+0

Нет «ожидания», поскольку он дает мне «Оператор« ожидание »может использоваться только в асинхронном методе». и ни один из существующих кодов не является асинхронным.Все эти асинхронные вещи новы для меня, поэтому любая помощь приветствуется :-) –

+0

См. Также Update III –

ответ

1

Исправление оказалось, чтобы убедиться, сайт работает .NET 4.5 или выше:

<system.web> 
    <httpRuntime targetFramework="4.6" /> 
    <compilation targetFramework="4.6"> 
    ... 
    </compilation> 
</system.web> 

Видимо команда ASP.NET сделал ASP. NET больше задач в .NET 4.5.

 Смежные вопросы

  • Нет связанных вопросов^_^