Объект типа System.Типа int32' не может быть преобразован в тип System.Сеть.Безопасность.Криптография.Цель"

Я получаю эту ошибку, когда я пытаюсь построить. Я только что установил Visual Studio 2012 и .Net 4.5, но этот проект все еще находится на 2010.

вот строка кода, с которой у меня возникают проблемы:

private static MethodInfo _encode;
public static string Encode(CookieProtection cookieProtection, byte[] buf, int count)
{
  return (string)_encode.Invoke(null, new object[] { cookieProtection, buf, count });
}

появляется ArgumentException was unhandled by user code об ошибке, говорящее, "Object of type 'System.Int32' cannot be converted to type 'System.Web.Security.Cryptography.Purpose'" ничего не изменилось в моей среде разработки, и у моих коллег нет той же проблемы, но у них также нет VS2012.

нашел статьи о Sitecore имея это ошибка, но это единственное место,где я видел его всплывающее.

там они говорят: "это потому, что в .NET 4.5 есть некоторые новые пространства имен в системе.Web"

их решение-это:

  • удалите VS11, если он установлен
  • удалить .NET 4.5
  • переустановите .NET 4

Это кажется смешным решением, которое 4.5 и 4 не могут быть на одной машине.

кто-нибудь знает, что может быть причиной этого и каких-либо лучших решений, прежде чем я попытаюсь удалить и переустановить кучу вещей?

комментарий также говорит попробовать: </setting name="login.rememberlastloggedinusername" value="false" > но я тоже не хочу этого делать.

4 ответов


Как упоминалось @hvd, этот код использует отражение для вызова внутренних методов, которые Microsoft изменила в .NET 4.5.

к счастью, .NET 4.0 представил System.Web.Security.MachineKey класс с публикой Encode() и Decode() методы, которые выполняют в основном то же самое, что и внутренние методы в CookieProtectionHelper. Обратите внимание, что cookies, которые были зашифрованы с помощью CookieProtectionHelper.Encode() не удастся расшифровать с помощью MachineKey.Decode().

Также обратите внимание, что в .NET 4.5 эти методы устарели в пользу Protect() и Unprotect().


измените значение на false в web.config:

<setting name=”Login.RememberLastLoggedInUserName” value=”false” /> 

(от: http://truncatedcodr.wordpress.com/2012/06/20/fix-sitecore-and-net-framework-4-5/)


вы получили это от здесь?

_encode = cookieProtectionHelper.GetMethod(
    "Encode", BindingFlags.NonPublic | BindingFlags.Static);

Это зависит от внутренних деталей реализации .NET Framework, которые MS никогда не обещала, останутся неизменными. Так что да, обновление на месте .NET Framework вполне может заставить такой код перестать работать. Это не ошибка в .NET 4.5. Это ошибка в вашем ... этом ... коде для того, чтобы полагаться на вещи, на которые вы не можете положиться.

и для его решения прекратите использовать этот метод. Если есть открытый API, который делает что хочешь, используй это. Если нет, реализуйте его сами.


Если вы видите эту ошибку при использовании программного обеспечения CMS Ektron, следующий в 8.7 примечания к выпуску-

71233 - если вы установили сайт 8.6.1 и включили шифрование файлов cookie в сеть.конфиг (), затем установлен Microsoft .NET Framework 4.5, вы увидели эту ошибку:

 Server Error in '/' Application. 
 Object of type 'System.Int32' cannot be converted to type System.Web.Security.Cryptography.Purpose'. This

фиксирован.

Как упоминалось в других ответах, одним из решений является откат в .Net framework 4.0. Другие ответы в этом конкретном случае с Ektron-отключить шифрование файлов cookie или обновить до 8.7.