2013-10-02 3 views
0

Je convertis un projet web MVC3 en MVC4. J'ai créé un ElmahHandleErrorAttribute qui hérite de HandleErrorAttribute qui a bien fonctionné dans MVC3 et fonctionne aussi bien sur ma machine de dev locale, mais il jette l'exception suivante dans l'environnement de test ...Pourquoi mon MVC4 HandleErrorAttribute ne fonctionne-t-il pas?

[InvalidOperationException: The given filter instance must implement one or more of the following filter interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.] 
    System.Web.Mvc.GlobalFilterCollection.ValidateFilterInstance(Object instance) +110 
    System.Web.Mvc.GlobalFilterCollection.AddInternal(Object filter, Nullable`1 order) +17 
    System.Web.Mvc.GlobalFilterCollection.Add(Object filter) +12 
    Home2Me.MvcApplication.RegisterGlobalFilters(GlobalFilterCollection filters) in c:\###\Home2Me\Global.asax.cs:16 
    Home2Me.MvcApplication.Application_Start() in c:\###\Home2Me\Global.asax.cs:118 

[HttpException (0x80004005): The given filter instance must implement one or more of the following filter interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.] 
    System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +9249709 
    System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +131 
    System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +194 
    System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +339 
    System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +253 

[HttpException (0x80004005): The given filter instance must implement one or more of the following filter interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.] 
    System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9164336 
    System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97 
    System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +256 

Il n'y a pas vraiment quelque chose de spécial à propos de la classe. C'est assez proche de la norme pour Elmah.

public class ElmahHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute 
{ 

    /// <summary> 
    /// Called when an exception occurs. 
    /// </summary> 
    /// <param name="context"></param> 
    public override void OnException(ExceptionContext context) 
    { 
     base.OnException(context); 
     if (!context.ExceptionHandled) return; // if unhandled, will be logged anyhow 
     var e = context.Exception; 
     HandleException(e); 
    } 

... (code snipped for brevity) ... 

} 

Et voici le code qui enregistre le filtre Global.asax.cs ...

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new ElmahHandleErrorAttribute()); 
} 

Le filtre est défini dans un ensemble séparé qui est également mis à jour MVC4. J'ai plusieurs projets qui utilisent ce filtre. L'un d'entre eux fonctionne très bien dans l'environnement de test, et un autre a exactement le même problème.

Des idées sur ce qui pourrait être faux? Je suis assez confiant que toutes les références MVC3 ont été correctement mises à jour dans le projet, y compris les fichiers web.config dans le répertoire racine et vues. Il fonctionne localement et j'ai désinstallé MVC3 et supprimé tous les dll "supplémentaires" MVC3 qui traînent.

Répondre

0

Je crois avoir trouvé une réponse. J'ai ajouté une section d'exécution dans le fichier web.config racine pour convertir les références MVC3 à MVC4.

<configuration> 
    ... (snipped for brevity) ... 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
       <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Je préférerais corriger quoi que ce soit qui fait référence à MVC3, mais je ne peux pas comprendre ce qui pourrait être. Cela devra être une réponse assez bonne pour le moment.

Questions connexes