2010-09-28 4 views
1

Je reçois une erreur bizarre dans un projet ASP.NET MVC (mvc dll version 2.0.0.0) après que le serveur est sous charge (50 à 100 requêtes par seconde) pendant quelques heures et le cache approche de sa limite de mémoire. Si je lis le journal des erreurs à droite (nous utilisons elmah) l'analyseur de paramètre d'action MVC échoue avant qu'il ne parvienne à l'action de mon contrôleur. À partir du rapport d'erreurs (ci-dessous), il semble que le classeur modèle qui remplit les paramètres d'action soit concerné. J'ai vérifié la chaîne de requête url &, ils fonctionnent bien dans tous mes tests, et il n'y a rien d'étrange à les différencier des autres demandes qui ont fonctionné. Tous les paramètres sont présents et contiennent des valeurs valides.Copie Local! = True System.Web.MVC - Dictionnaire Asp.net MVC 2 Erreur dans le contrôleur avant l'action

J'ai recherché les appels du dictionnaire et un candidat est le filtre que j'applique au niveau du contrôleur (par opposition au niveau d'action). Cependant, je ne vois pas ce filtre dans le rapport d'erreurs.

Est-ce un bug MVC 2? Si ce n'est pas un bug de MVC, comment étudieriez-vous davantage?

**Code - renamed & simplified but parameters are the same types** 
[OutputCache(Duration = 1000000, VaryByParam = "*", Location=OutputCacheLocation.Any)] 
public class MyController : Controller 
{ 
    public ActionResult MyAction(Int32 one, Int32 two, Int32 three,string a, string b, string b) 
    { 
     var modelData= FetchModelData(one,two,three,a,b,c);//load model data 
     return View(modelData); 
    } 

} 

     **Error**   
System.ArgumentException: An item with the same key has already been added. 
at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) 
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 
at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) 
at System.Web.Mvc.TypeDescriptorHelper._AssociatedMetadataTypeTypeDescriptor.TypeDescriptorCache.GetAssociatedMetadataType(Type type) 
at System.Web.Mvc.TypeDescriptorHelper._AssociatedMetadataTypeTypeDescriptor..ctor(ICustomTypeDescriptor parent, Type type) 
at System.Web.Mvc.TypeDescriptorHelper._AssociatedMetadataTypeTypeDescriptionProvider.GetTypeDescriptor(Type objectType, Object instance) 
at System.Web.Mvc.TypeDescriptorHelper.<GetTypeDescriptorFactory>b__0(Type type) 
at System.Web.Mvc.ModelBinders.GetBinderFromAttributes(Type type, Func`1 errorMessageAccessor) 
at System.Web.Mvc.ModelBinderDictionary.GetBinder(Type modelType, IModelBinder fallbackBinder) 
at System.Web.Mvc.ControllerActionInvoker.GetModelBinder(ParameterDescriptor parameterDescriptor) 
at System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) 
at System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
at System.Web.Mvc.Controller.ExecuteCore() 
at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4() 
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0() 
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) 
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

--------------------------------- EDIT --------- ---------------------

Le problème était un bogue de threading MVC dans RC qui a ensuite été corrigé dans le RTM.
Le problème est que j'étais DÉJÀ en utilisant MVC RTM dans mon projet et la configuration copie local = true! Pourquoi ne puis-je pas définir "Copy Local = true" pour les références à System.Web.MVC?

Voici la réponse

D'abord, je devais me prouver que la mauvaise version de MVC est en cours d'exécution sur le serveur je this article et code here pour tester la version dll MVC et obtenu l'erreur Je m'attendais à:

Des versions obsolètes ou obsolètes des futurs ASP.NET MVC et ASP.NET MVC sont chargées.

Version équipé d'ASP.NET MVC est: ASP.NET MVC 2 RC 1 (2.0.41211.0) Version chargé de ASP.NET MVC Futures est: ASP.NET MVC 2 à terme RTM (2.0.50217.0) Télécharger ASP.NET MVC 2 RC 1 Contrats à partir de http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37423#DownloadId=97581.aspx?ReleaseId=37423#DownloadId=97581.

Pourquoi cela se produit-il?

Voici une question SO que suggests VS and the server silently ignore my command. Localement, j'ai eu du mal à sortir MVC 2 RC du GAC lors de la mise à niveau vers RTM. Ainsi, dans mes projets Visual Studio, je me suis assuré de mettre "copy local" = true pour System.Web.MVC en pensant que cela m'empêcherait de me soucier des différentes versions de System.Web.MVC sur différents serveurs.

Comment puis-je corriger cela?

Apparemment, tous les serveurs avec MVC RC dans le GAC ignorent silencieusement les instructions de copie locale pour system.web.mvc et la seule solution à mettre à niveau vers RTM sur chaque serveur.

Répondre

1

J'ai trouvé ce link, qui montre la même exception et trace de pile. Il suggère que c'était un bug dans RC, mais a été corrigé dans RTM. Est-il possible que vous ayez encore une version préliminaire de l'assemblage?

La version du fichier de System.Web.Mvc.dll que j'ai est 2.0.50217.0 (version de montage est 2.0.0.0). Je ne suis pas un expert ASP.NET MVC 2, donc c'est tout ce que je peux offrir (désolé). Si cela ne vous aide pas à résoudre l'erreur, alors je suggérerais d'offrir une récompense.

Bonne chance!

Modifier

Ajouter ce lien à une question sur les versions SO System.Web.Mvc.dll: How to be sure that my MVC project is running on the correct version after upgrade to vs2010?

D'après les commentaires de cette question:

Vérifiez le numéro de version . RC 2 est 2.0.50129.0. La publication est 50217

+0

Merci! Il me faudra environ une heure pour confirmer que c'est le problème, mais je ferai un rapport de toute façon. – Glenn

+0

Quand je regarde les références à l'intérieur VisualStudio Je vois – Glenn

+0

Path: C: \ Program Files (x86) \ Microsoft ASP.NET \ ASP.NET MVC 2 \ Assemblies \ System.Web.Mvc.dll – Glenn