2013-05-21 12 views
5

Abbiamo una grande applicazione Web .NET MVC3, che utilizza T4MVC. Di recente l'abbiamo aggiornato a MVC4, e tutto è buono tranne che per T4MVCExtensions (versione 3.6.5 di NuGet) che dipende ancora da System.Web.Mvc versione 3. Le dipendenze di runtime che dovresti installare nel web.config DOVREBBE essere reindirizzare i binding assembly, ma non sembrano essere. La seguente eccezione si verifica:AssemblyBinding BindingRedirect non funziona per l'app MVC4 con T4MVCExtensions

Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 

Description: An unhandled exception occurred during the execution of the current web  request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 

Abbiamo il seguente nel nostro file web.config, che dovrebbe essere la mappatura, ma non sembra essere -

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="System.Web.Helpers" 
         publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /> 
    </dependentAssembly> 
    <dependentAssembly> 
    <assemblyIdentity name="System.Web.Mvc" 
         publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="4.0.0.0" /> 
    </dependentAssembly> 
    <dependentAssembly> 
    <assemblyIdentity name="System.Web.WebPages" 
         publicKeyToken="31bf3856ad364e35" /> 
    <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /> 
    </dependentAssembly> 
</assemblyBinding> 

Ho abilitato il log di fusione, solo per verificare la mia pazzia, e vedo che, sì, sembra proprio che stia cercando di usare il binario mvc3, e non andando a 4:

*** Assembly Binder Log Entry (5/21/2013 @ 3:37:23 PM) *** 

The operation failed. 
Bind result: hr = 0x80004005. Unspecified error 

Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 
Running under executable c:\windows\system32\inetsrv\w3wp.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: User = IIS APPPOOL\ASP.NET v4.0 
LOG: DisplayName = System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 
(Fully-specified) 
LOG: Appbase = file:///C:/Work/Webs/SSUApp/SSUApp/ 
LOG: Initial PrivatePath = C:\Work\Webs\SSUApp\SSUApp\bin 
LOG: Dynamic Base = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\lssapp\7a6e6cde 
LOG: Cache Base = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\lssapp\7a6e6cde 
LOG: AppName = d5bcf9a8 
Calling assembly : App_Web__managerulespartial.cshtml.38bccb18.jb5ozz39, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null. 
=== 
LOG: Start validating all the dependencies. 
LOG: [Level 1]Start validating native image dependency mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. 
LOG: [Level 1]Start validating IL dependency System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. 
LOG: [Level 1]Start validating IL dependency System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. 
LOG: [Level 1]Start validating native image dependency System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. 
LOG: [Level 1]Start validating native image dependency System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. 
LOG: [Level 1]Start validating IL dependency System.Web.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. 
LOG: [Level 1]Start validating IL dependency System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. 
LOG: [Level 1]Start validating IL dependency System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. 
LOG: [Level 1]Start validating IL dependency System.Runtime.Caching, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. 
LOG: [Level 1]Start validating IL dependency Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. 
LOG: [Level 1]Start validating IL dependency System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. 
LOG: [Level 1]Start validating IL dependency System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. 
LOG: [Level 1]Start validating IL dependency System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. 
LOG: [Level 1]Start validating IL dependency System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. 
Native image has correct version information. 
LOG: Validation of dependencies succeeded. 
LOG: Bind to native image succeeded. 
Attempting to use native image C:\Windows\assembly\NativeImages_v4.0.30319_64\System.Web.Mvc\f234ba2bcf5f845279e46dc04198a7cd\System.Web.Mvc.ni.dll. 
Rejecting code sharing because a dependent assembly did not match the conditional APTCA share mode 
Native image successfully used. 

Tutte le idee si faranno scricchiolare, dal momento che ho già bruciato un sacco di ore su questo.

Grazie, Francesco

risposta

11

Avevo un problema di binding dell'assembly molto simile, dopo aver aggiornato manualmente un set di progetti MVC3 in MVC4. Nonostante avessi gli elementi di binding dell'assieme in web.config, ricevevo errori simili agli errori T4MVC ma dalle estensioni di Telerik MVC.

Il visualizzatore di Fusion Log è stato utile in quanto ha confermato che due versioni di system.web.mvc venivano caricate nel dominio dell'applicazione.

Alla fine, la rimozione dello spazio dei nomi dall'elemento di configurazione di root nella radice del progetto web.config ha risolto il problema.

Così, il web.config era come questo:

<?xml version="1.0" encoding="utf-8"?> 
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> 
<!--... elements deleted for clarity ...--> 
</configuration> 

E dopo aver rimosso lo spazio dei nomi che appare così:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<!--... elements deleted for clarity ...--> 
</configuration> 

Questo post del blog ha più informazioni sullo spazio dei nomi errato: http://www.dotnetish.com/runtime/xmlnshttpschemas-microsoft-com-netconfigurationv2-0/

+1

Signore, vinci! Questo è esattamente quello che è. Grazie mille. –

0

per isolare, vorrei provare a creare un piccolo gruppo di manichino che è costruito contro MVC3 per vedere se si comporta in modo simile. Non dovrebbe esserci nulla di speciale nel gruppo di supporto T4MVC.

Inoltre, si prega di guardare il mio progetto di prova https://github.com/davidebbo/T4MVCSampleApp. Questo è un progetto MVC4 che utilizza l'ultimo T4MVC e funziona perfettamente per me. Funziona per te?

Se tutto il resto fallisce, se è possibile condividere un progetto di riproduzione (ad es. Su github), posso provare a dare un'occhiata.

+0

Grazie per la vostra risposta David, ho provato l'isolamento, e, naturalmente, ha funzionato perfettamente. In effetti, ho persino iniziato un nuovo progetto di applicazione web all'interno della mia soluzione e anche il rebinding è perfetto. Dato che ho archiviato il bug, ho anche avuto lo stesso problema con un WebGrease.dll aggiornato, quindi penso che T4MVCExtension sia completamente innocente in questo caso, sono sicuro che si tratta solo di una errata configurazione nel web.config del mio progetto. BTW - Amo T4MVC, è una fantastica aggiunta ad esempio al quadro, e in realtà prende la congettura risolve di usare MVC. Grazie mille. –

+0

Ho appena visto la soluzione sopra. Sono contento che abbia funzionato! –

Problemi correlati