2012-08-06 8 views
9

Ricevo ora questo errore ogni volta che provo a creare. Ho appena installato Visual Studio 2012 e .Net 4.5, ma questo progetto è ancora in 2010.L'oggetto di tipo 'System.Int32' non può essere convertito in tipo 'System.Web.Security.Cryptography.Purpose'

Ecco la riga di codice che sto avendo problemi con:

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

ricevo un errore ArgumentException was unhandled by user code dicendo "Object of type 'System.Int32' cannot be converted to type 'System.Web.Security.Cryptography.Purpose'" Nulla è cambiato nel mio ambiente di sviluppo e i miei colleghi non hanno lo stesso problema, ma non hanno VS2012.

Ho trovato an article su Sitecore che ha questo errore, ma questo è l'unico posto in cui l'ho visto apparire.

Ci dicono: "Questo perché in .NET 4.5 ci sono alcuni nuovi spazi dei nomi in System.Web"

La loro soluzione è quella di:

  • disinstallazione VS11 se lo avete installato
  • Disinstallare .NET 4.5
  • Reinstallare .NET 4

Questo sembrare una soluzione ridicola t i cappelli 4.5 e 4 non possono essere sulla stessa macchina.

Qualcuno sa che cosa potrebbe causare questo e altre soluzioni migliori prima di provare a disinstallare e reinstallare un sacco di cose?

Un commento dice anche di provare: </setting name="login.rememberlastloggedinusername" value="false" > ma non voglio farlo neanche io.

+0

Difficile sapere cosa sta succedendo con quello che hai fornito. non c'è niente che tu abbia postato che usi effettivamente il tipo Scopo. Che metodo stai cercando di invocare? –

+0

Mi dispiace, ho aggiunto dove sto chiamando a questo. È abbastanza informazioni? – JCisar

+0

Non vedo come la tua modifica sia correlata al codice che hai originariamente pubblicato e che abbia "problemi". Quale classe 'HttpSecureCookie' stai usando? –

risposta

9

Come alluso da @hvd, questo codice utilizza la reflection per chiamare i metodi interni che Microsoft ha modificato in .NET 4.5.

Fortunatamente NET 4.0 ha introdotto la classe System.Web.Security.MachineKey con pubblici Encode() e Decode() metodi effettuando fondamentalmente la stessa cosa come i metodi interni nel CookieProtectionHelper. Si noti che i cookie crittografati con CookieProtectionHelper.Encode() non potranno essere decifrati con MachineKey.Decode().

Si noti inoltre che in .NET 4.5 questi metodi sono obsoleti a favore di Protect() e Unprotect().

+1

Grazie per questo post! Mi hai dato un'ottima soluzione per quello che potevo usare al posto di quello che ho. Ci proverò! – JCisar

+1

Sostituire CookieProtectionHelper con MachineKey.Encode() e Decode() ha funzionato per me. Sto usando 4.0 ma recentemente installato 4.5 che ha causato ciò. – Induster

3

L'hai ricevuto da here?

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

Questo si basa sui dettagli di implementazione interna del .NET Framework che la SM non ha mai promesso sarebbe rimasto invariato. Quindi sì, un aggiornamento sul posto di .NET Framework potrebbe benissimo fare in modo che tale codice smetta di funzionare. Questo non è un bug in .NET 4.5. Questo è un bug nel tuo - quel - codice per fare affidamento su cose su cui non puoi fare affidamento.

E per risolverlo, smetti di usare quel metodo. Se c'è un'API pubblica che fa quello che vuoi, usa quello. Se non lo è, implementalo tu stesso.

+0

Non so da dove provenisse il codice ... ero qui prima che iniziassi a lavorare per questa compagnia. – JCisar

+0

In entrambi i casi, se questo è ciò che il tuo '_encode' è impostato, è davvero necessario scaricarlo. Il tuo codice non fallirà con le versioni .NET rilasciate ufficialmente, ma lo farà presto. – hvd

+0

Dove dice che le nuove versioni lo svaluteranno? – JCisar

1

Se viene visualizzato questo errore durante l'utilizzo del software CMS Ektron, il seguente è nella loro 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.

Come accennato nelle altre risposte, una soluzione è il rollback su .Net framew ork 4.0. Le altre risposte in questo caso particolare con Ektron sono di disabilitare la crittografia dei cookie o l'aggiornamento a 8.7.

+0

Grazie Spongeboy! Hai salvato un giorno di lavoro per me. – eastboundr