2016-10-06 3 views
0

J'appelle un certain nombre de méthodes qui ont été décorées avec [WebMethod] via jQuery ajax.Cycle de vie de la page ASPX lors de l'appel de [WebMethod] s

Ceux-ci nécessitent une connexion à une base de données à mettre en place dans une bibliothèque externe qui sera la même pour chaque méthode.

Mon code d'origine ressemblait à ceci:

public partial class Server : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // code to set up DB connections 
     ExternalLibrary.SetupDB(); 
    } 

    [WebMethod] 
    public static string AjaxAccessibleMethod() 
    { 
     try 
     { 
      // get some data from the database via the external library 
      ExternalLibrary.CallDatabase(); 
     } 
     catch(Exception ex) 
     { 
      // handle errors 
     } 
    } 
} 

Cela fonctionnait, mais ont commencé à lancer des exceptions affirmant que la base de données du ExternalLibrary n'a pas été initialisé. Placer des points d'arrêt dans mon code J'ai découvert que l'événement Page_Load n'était pas appelé lors de l'appel de mon AjaxAccessibleMethod, j'ai aussi essayé de déplacer le programme d'installation DB dans l'événement Page_Init mais de la même manière il n'a pas été appelé.

Quelqu'un peut-il m'expliquer le cycle de vie de la page aspx lors de l'utilisation de WebMethods? Le fait que cela a fonctionné initialement semble impliquer que Page_Load a été appelé, mais il ne l'est plus.

+1

http://stackoverflow.com/a/18072090/885626 – Ric

Répondre

5

Notez que la méthode que vous utilisez comme WebMethod est statique, cela devrait être le premier indice sur le fait que l'objet Page n'est pas créé du tout. Page Méthodes est une alternative simple aux services Web complets, et en tant que tel, son cycle de vie est plus similaire au service Web qu'à la page. Cela signifie que la requête passe par le pipeline ASP.NET général, avec des objets tels que HttpContext, Request et autres. Mais alors la différence se produit: pour les requêtes de page et les postbacks, l'objet de page est créé et toute la série d'événements de page se produit, alors que pour les méthodes page, l'objet page n'est pas créé et la méthode s'appelle simplement Server.AjaxAccessibleMethod().

Il n'y a vraiment aucun moyen de mélanger les deux, car cela compliquerait inutilement le traitement des appels aux méthodes de page. Donc, la seule voie à suivre pour vous ici en double code nécessaire:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // code to set up DB connections 
    ExternalLibrary.SetupDB(); 
} 

[WebMethod] 
public static string AjaxAccessibleMethod() 
{ 
    ExternalLibrary.SetupDB(); 
    ... 
} 
+0

que diriez-vous d'ajouter « ExternalLibrary.SetupDB(); » dans un constructeur statique? De cette façon, je pense que la duplication de code peut être évitée. – Boney

+0

@Boney, je ne recommanderais pas d'utiliser le constructeur statique. Le problème ici est que vous n'avez absolument aucun contrôle sur quand il va être appelé. Cela peut donc arriver trop tôt pour les besoins du PO. En outre, le code actuel l'appelle une fois par demande, et au moins dans le cas de méthodes de page, vous ne pouvez pas être certain que cela va se produire avec c'tor statique – Andrei

+0

Merci Andrei, Ce que votre dire est parfaitement logique. Mais ça me laisse toujours me demander pourquoi ça a marché ... et ce qui m'inquiète, c'est que j'ai utilisé ce modèle ailleurs (et ça marche) - y a-t-il un mécanisme que vous connaissez qui pourrait permettre que cela se produise, par exemple appeler la page (plutôt qu'une [WebMethod]) et ensuite appeler le [WebMethod]? – Morvael