“System.Int32”类型的对象无法转换为“System.Web.Security.Cryptography.Purpose”类型

时间:2012-08-06 15:50:37

标签: c# exception-handling asp.net-4.5

每当我尝试构建时,我都会收到此错误。我刚刚安装了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。

我发现an article关于Sitecore有这个错误,但这是我看到它弹出的唯一地方。

他们说,“这是因为在.NET 4.5中,System.Web中有一些新的命名空间”

他们的解决方案是:

  • 如果安装了VS11,请将其卸载
  • 卸载.NET 4.5
  • 重新安装.NET 4

这似乎是一个荒谬的解决方案,4.5和4不能在同一台机器上。

在我尝试卸载并重新安装一堆东西之前,是否有人知道可能导致此问题的原因以及任何更好的解决方案?

评论还说要尝试:</setting name="login.rememberlastloggedinusername" value="false" >,但我也不想这样做。

4 个答案:

答案 0 :(得分:9)

正如@hvd所提到的,这段代码使用反射来调用Microsoft在.NET 4.5中更改的内部方法。

幸运的是,.NET 4.0引入了System.Web.Security.MachineKey类,其公共Encode()Decode()方法基本上与CookieProtectionHelper中的内部方法完全相同。请注意,使用CookieProtectionHelper.Encode()加密的Cookie无法使用MachineKey.Decode()进行解密。

另请注意,在.NET 4.5中,不推荐使用这些方法,而使用Protect()Unprotect()

答案 1 :(得分:7)

在web.config中将值更改为false:

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

(来自:http://truncatedcodr.wordpress.com/2012/06/20/fix-sitecore-and-net-framework-4-5/

答案 2 :(得分:3)

你是从here得到的吗?

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

这依赖于MS Framework从未承诺过的.NET Framework的内部实现细节。所以,是的,.NET Framework的就地升级很可能会使这些代码停止工作。这不是.NET 4.5中的错误。这是你的代码中的错误 - 依赖于你不能依赖的东西。

要解决它,请停止使用该方法。如果有一个公共API可以执行您想要的操作,请使用它。如果没有,请自行实施。

答案 3 :(得分:1)

如果您在使用CMS软件Ektron时看到此错误,则以下内容位于8.7 release notes -

  

71233 - 如果您安装了8.6.1站点并启用了cookie加密   web.config(),   然后安装了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。