HttpRuntime CacheInternal Ссылочная исключительная ситуация NULL при чтении пользовательских сеансов (отражение)
После некоторых обновлений на наших серверах Windows(2008R2,2012) выдается сообщение об ошибке приложения Asp.net:
var obj_1 = typeof(HttpRuntime).GetProperty("CacheInternal", BindingFlags.NonPublic | BindingFlags.Static);
CacheInternal обнуляется, не знаете почему?
следующее решение не работает:( решение
3 ответа
Я нашел решение. Теперь класс HTTPRuntime не имеет свойства CacheInternal. Для выполнения вышеуказанной задачи я создал глобальный список, добавляя сеансы в этот список в Session_Start и удаляя сеансы в функциях Sessions_end в Global.asax.
Я нашел решение, которое может быть лучшим на данный момент. Если у кого-то есть другой, дайте мне знать!
object aspNetCacheInternal = null;
var cacheInternalPropInfo = typeof(HttpRuntime).GetProperty("CacheInternal", BindingFlags.NonPublic | BindingFlags.Static);
if (cacheInternalPropInfo == null)
{
// At some point, after some .NET Framework's security update, that internal member disappeared.
// https://stackru.com/a/45045160
//
// We need to look for internal cache otherwise.
//
var cacheInternalFieldInfo = HttpRuntime.Cache.GetType().GetField("_internalCache", BindingFlags.NonPublic | BindingFlags.Static);
if (cacheInternalFieldInfo != null)
{
var httpRuntimeInternalCache = cacheInternalFieldInfo.GetValue(HttpRuntime.Cache);
var httpRuntimeInternalCacheField = httpRuntimeInternalCache.GetType().GetField("_cacheInternal", BindingFlags.NonPublic | BindingFlags.Instance);
if (httpRuntimeInternalCacheField != null)
aspNetCacheInternal = httpRuntimeInternalCacheField.GetValue(httpRuntimeInternalCache);
}
}
else
{
aspNetCacheInternal = cacheInternalPropInfo.GetValue(null, null);
}
return aspNetCacheInternal;
С уважением!
Этот внутренний член присутствовал в.NET 2.0 и исчез где-то между.NET 3.5 и.NET 4.6.1. Вот почему вы не должны использовать рефлексию, чтобы полагаться на непубличных участников. Они могут исчезнуть или быть переименованы в любое время.
Поскольку.NET обладает обратной совместимостью, принудительное выполнение определенной версии во время выполнения не будет использовать более старые сборки во время выполнения, если доступны более новые: .NET 4.6.1 по-прежнему является обновлением всех предыдущих версий до версии 4.0.
Поэтому я думаю, что это обновление либо пропатчило элемент от сборки System.Web, либо оно никогда не было в 4.0 с самого начала, и пул ваших приложений каким-то образом изменился с.NET 2.0 на.NET 4.0.
Конечно, не рекомендуется удалять обновления, но вы можете попробовать найти обновление, удаляющее этого участника. Затем вам нужно будет убедиться, что это не обновление для системы безопасности.
Или же заставьте приложение работать под.NET 2.0, если это жизнеспособно.
Вы также можете попытаться найти другой способ решения исходной проблемы.