2009-07-14 4 views
9

J'ai entendu de bonnes choses à propos de Softsys Hosting et j'ai donc décidé de leur transférer ma solution ASP.NET MVC. Mais ça ne marcherait pas sur eux. J'ai été en mesure de localiser le problème à mes gestionnaires d'événements BeginRequest. Si je les avais, j'aurais une erreur. Voici mon code.Pourquoi mon hôte (softsyshosting.com) ne peut-il pas prendre en charge les gestionnaires d'événements BeginRequest et EndRequest?

protected void Application_Start() 
{ 
    RegisterRoutes(RouteTable.Routes); 
    this.BeginRequest += new EventHandler(MvcApplication_BeginRequest); 
    this.EndRequest += new EventHandler(MvcApplication_EndRequest); 
} 

void MvcApplication_EndRequest(object sender, EventArgs e) 
{ 
} 

void MvcApplication_BeginRequest(object sender, EventArgs e) 
{ 
} 

Je pourrais reproduire le problème en créant simplement l'application ASP.NET MVC par défaut et en ajoutant le code ci-dessus. La chose étrange est que ce code a bien fonctionné sur mon ancien hôte et qu'il ne plante que sur mon nouvel hôte (partagé). Si j'ai ces gestionnaires d'événements dans mon code, j'obtenir cette erreur:

Server Error in '/' Application.   Object reference not set to an instance of an object. 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.NullReferenceException: Object reference not set to an instance of an object.

Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.] System.Web.PipelineModuleStepContainer.GetStepArray(RequestNotification notification, Boolean isPostEvent) +27 System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification notification, Boolean isPostEvent) +11 System.Web.PipelineStepManager.ResumeSteps(Exception error) +205 System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb) +91 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +514

J'ai essayé de dépannage avec ce Softsys, mais ils ne sont pas très utiles, au fond ils ont juste confirmé que j'avais tourné le « Pipeline ASP.NET (MVC) "dans mon panneau de contrôle d'administration.

Quelqu'un peut-il:

  1. Dites-moi si je suis quelque chose de mal codé
  2. Montrez-moi un travail autour
  3. Expliquez-moi pourquoi cette erreur est INTERVENUES sur un hôte et non l'autre.
+0

serait-ce pas plutôt une question pour le soutien de votre hébergeur? –

+0

Utilisez-vous NHibernate par hasard? –

+0

Oliver, oui j'ai essayé d'obtenir le support de Softsys Hosting, mais ils n'ont pas été très utiles. Ils voulaient me faire payer 95 $/HR pour résoudre ce problème. J'étais heureux avec tout le reste à propos d'eux et je ne veux pas les abandonner si c'est quelque chose que je fais mal. Dreas, non, je n'utilise pas NHibernate. – Whozumommy

Répondre

7

On dirait que vous êtes passé du mode IIS 6 ou IIS 7 Classic au mode IIS 7 Integrated. En mode intégré IIS 7, le traitement de la demande a été découplé du démarrage de l'application. This article explique le pourquoi et le comment. Pour résoudre ce problème, vous devez déplacer votre code vers Application_BeginRequest à la place.

16

Vous devez enregistrer vos gestionnaires dans chaque instance HttpApplication. Il peut y avoir plusieurs instances poolées de HttpApplication. Application_Start est appelée une seule fois (pour IIS 6 et IIS 7 en mode classique - à la première demande, pour le mode intégré IIS 7 - au démarrage de l'application web, juste avant toute demande). Donc, pour que tout fonctionne, vous devez ajouter des gestionnaires d'événements dans la méthode Init substituée de HttpApplication ou dans le constructeur de celle-ci. Si vous les ajoutez dans le constructeur, ces gestionnaires seront invoqués en premier, même avant les gestionnaires des modules enregistrés.
Donc, votre code devrait ressembler à ceci:

public class MySmartApp: HttpApplication{ 
    public override void Init(){ 
     this.BeginRequest += new EventHandler(MvcApplication_BeginRequest); 
     this.EndRequest += new EventHandler(MvcApplication_EndRequest); 
    } 
    protected void Application_Start(){ 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 

ou comme ceci:

public class MySmartApp: HttpApplication{ 
    public MySmartApp(){ 
     this.BeginRequest += new EventHandler(MvcApplication_BeginRequest); 
     this.EndRequest += new EventHandler(MvcApplication_EndRequest); 
    } 
    protected void Application_Start(){ 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 
+0

Ceci est une excellente information, même si je soupçonne que cela ne résoudra pas ce problème. Je peux reprocher ce problème (enfin, ça ne me concerne que sporadiquement) sans enregistrer les gestionnaires dans Application_OnStart. Il serait utile de comprendre ce que cette erreur signifie réellement (ce qui est nul). –

+0

Pouvez-vous fournir des liens concernant les informations ci-dessus? Peut-être un article MSDN? –

+0

Bonne réponse. Résolu le problème pour moi. C'était sur .NET 4.5, MVC 4, IIS 8. –

Questions connexes