2012-08-06 195 views
9

無論何時嘗試構建,我都會收到此錯誤。我剛安裝了Visual Studio 2012和.NET 4.5,但這個項目仍然是在2010年無法將類型爲'System.Int32'的對象轉換爲類型'System.Web.Security.Cryptography.Purpose'

這裏是我有問題的代碼行:

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" >但我不想這樣做。

+0

很難真正知道你所提供的是怎麼回事。即你沒有發佈實際使用類型Purpose的東西。你試圖調用什麼方法? – 2012-08-06 15:56:25

+0

對不起,我已經添加了我在這裏打電話的地方。這是足夠的信息嗎? – JCisar 2012-08-06 16:12:00

+0

我沒有看到您的編輯與您最初發布的代碼有關,並表示存在「問題」。你正在使用什麼'HttpSecureCookie'類? – 2012-08-06 16:15:58

回答

9

正如@hvd所暗示的,這段代碼使用了反射來調用微軟在.NET 4.5中改變的內部方法。

幸運的.NET 4.0中引入的System.Web.Security.MachineKey類公共Encode()Decode()方法可完成基本上同樣的事情,在CookieProtectionHelper內部方法。請注意,使用CookieProtectionHelper.Encode()加密的cookie將無法使用MachineKey.Decode()進行解密。

另請注意,在.NET 4.5中,這些方法已棄用,因此推薦使用Protect()Unprotect()

+1

謝謝你這篇文章!你爲我提供了一個很好的解決方案,而不是我擁有的東西。我會試試這些! – JCisar 2012-08-21 20:27:04

+1

用MachineKey.Encode()和Decode()替換CookieProtectionHelper爲我工作。我使用4.0,但最近安裝了4.5,導致這種情況發生。 – Induster 2013-12-02 18:59:42

3

你從here得到了嗎?

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

這依賴於MS從未承諾過的.NET Framework的內部實現細節保持不變。所以是的,.NET框架的就地升級很可能會使這種代碼停止工作。這不是.NET 4.5中的一個錯誤。這是你的代碼 - 依賴於你不能依賴的東西的代碼。

並解決它,停止使用該方法。如果有一個公共API可以實現你想要的功能,那就使用它。如果沒有,請自行實施。

+0

我不知道代碼來自哪裏......它在我開始爲這家公司工作之前就在這裏。 – JCisar 2012-08-06 16:54:22

+0

無論哪種方式,如果這就是你的'_encode'設置的,你真的需要拋棄它。您的代碼不會因官方發佈的.NET版本而失敗,但很快就會發生。 – hvd 2012-08-06 17:03:03

+0

它說新版本會貶低它呢? – JCisar 2012-08-07 16:44:13

1

如果您看到這個錯誤,而使用CMS軟件Ektron,以下是他們的8.7 release notes -

71233—If you installed an 8.6.1 site and enabled cookie encryption in web.config(), then installed Microsoft .NET Framework 4.5, you saw this error:

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

is fixed.

正如其他答案中提到的,一種解決方案是回滾到.Net框架奧克4.0。 Ektron在這個特殊情況下的其他答案是禁用cookie加密,或者升級到8.7。

+0

謝謝海綿寶寶!你爲我節省了一天的工作。 – eastboundr 2013-06-10 14:20:45

相關問題