每当我尝试构建时,我都会收到此错误。我刚刚安装了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中有一些新的命名空间”
他们的解决方案是:
这似乎是一个荒谬的解决方案,4.5和4不能在同一台机器上。
在我尝试卸载并重新安装一堆东西之前,是否有人知道可能导致此问题的原因以及任何更好的解决方案?
评论还说要尝试:</setting name="login.rememberlastloggedinusername" value="false" >
,但我也不想这样做。
答案 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。