2016-08-18 4 views
0

Я получаю NullReferenceExceptions в проекте webforms, который я поддерживаю. Уловка заключается в том, что для этого исключения нет stacktrace, потому что ни один из моих кодов не вызывает исключение. NullReferenceException was unhandledasync await Task null reference exception

Сведения об исключении скопированные в буфер обмена предлагает нулевую помощь:
System.NullReferenceException was unhandled Message: An unhandled exception of type 'System.NullReferenceException' occurred in mscorlib.dll Additional information: Object reference not set to an instance of an object.

При просмотре кода StackTrace не пользовательский, я вижу следующее (все в mscorlib): Stack Trace

В ошибка возникает случайным образом и непоследовательно, либо путем загрузки страниц, либо путем обратной передачи. Проблема началась после того, как я добавил System.Net.Http.HttpClient для вытягивания данных из служб REST, открытых на других сайтах. Обратите внимание, что HttpClient содержит только асинхронные методы для отправки/получения данных. Основываясь на внутренней stacktrace, я очень подозреваю, что Задача <>/async/ждет в качестве виновника.

Чтобы помочь устранить неполадки, позвольте мне подтвердить, что я запускаю это на сайте WebForms, компилирующем в .NET 4.6 (и если вы собираетесь сказать мне, что моя проблема в том, что мне нужно обновить до MVC, сохраните нажатия клавиш и не говорите об этом). В то время как HttpClient предоставляет все как Task <>, я называю их синхронно по телефону:
Task<MyObject> myResultTask = restClient.GetResultAsync(); MyObject myResult = myResultTask.Result; // no await

Заранее спасибо!

+3

просто позвонить Await лол – Steve

+0

@Steve нет, [ 'Task.Result'] (https://msdn.microsoft.com/en-us/library/dd321468 (v = vs.110) .aspx) _does_ дождаться завершения задачи до того, как она вернет свое значение. –

+2

@ RenéVogt, если я правильно помню, вы можете легко наткнуться на все виды странных проблем, не дожидаясь – Steve

ответ

2

У меня была эта проблема и я хотел бы предложить это как ответ.

В вашем web.config убедитесь, что вы имеете следующее:

<system.Web> 
     <httpRuntime targetFramework="4.5" /> 
    </system.Web> 

и

<appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />  
</appSettings> 

Смотреть подробнее здесь:

https://blogs.msdn.microsoft.com/webdev/2012/11/19/all-about-httpruntime-targetframework/

Это кажется просто врезаться случайным образом, если вы этого не сделаете. Я большой поклонник обратной совместимости, но не тогда, когда он просто падает, если вы не выбираете новый способ.

(Отдается в комментарии от Стивена Клири)