2011-06-15 5 views
0

Disons que j'ai un client qui remplit une donnée d'un site Web. la persistance sous-jacente utilisée est Nhibernate.Session stateful avec nhibernate et asp.net

Maintenant, la série d'événements comme celui-ci va

  1. utilisateur remplit le formulaire.
  2. il soumet le formulaire.
  3. La session nhibernate sessionfactory est créée et via l'objet client elle est enregistrée dans la base de données.
  4. La base de données valide l'objet session à l'aide d'un générateur natif pour nhibernate
  5. mais un incident survient avant que la réponse du serveur n'atteigne le client. la connexion au client se déclenche.
  6. le client peut voir une erreur de page introuvable ou demande une erreur de délai d'attente. et a un dilemme qu'il n'est pas encore enregistré. Il appuie de nouveau sur le bouton d'actualisation. et le même ensemble de données (bien que cela soit validé pour la base de données) a été envoyé au serveur pour la validation de la base de données.
  7. le serveur voit les données et enregistre à nouveau le même client avec un ID différent.
  8. donc le problème va comme. maintenant la même entrée de client a été dupliquée deux fois parce que la connexion a été coupée.

Maintenant quelqu'un peut-il me dire comment procéder dans ce scénario. Donc, même si le client soumet qu'il reconnaît juste une seule entrée et la soumet, même si la réponse a été coupée et il appuie sur le bouton d'actualisation?

Répondre

0

Pensées:

1) Vous ne voulez pas créer la NHibernate SessionFactory à chaque demande. Cela devrait être créé une fois et ensuite utilisé par toutes les futures demandes. C'est une opération lourde. Seules les sessions doivent être créées à chaque demande.

2) Gérer la transaction dans une méthode de haut niveau - pour réduire la probabilité que quelque chose se passe mal APRÈS avoir effectué la transaction, mais AVANT que le client ait une réponse.

3) Protégez-vous contre la resoumise de la méthode "Refresh", en faisant en sorte que la fonction submit retourne une page différente qui présente l'information. Cette page ne doit rien soumettre.

4) Protégez-vous contre un côté serveur de resubmit en validant la soumission par rapport aux informations d'identification envoyées précédemment. Informer le client s'il s'est déjà enregistré et lui donner un moyen d'accéder aux détails enregistrés (par exemple, la récupération de mot de passe). Par exemple, si vos utilisateurs sont saisis par adresse e-mail, effectuez les opérations suivantes: étapes suivantes:

+0

le 4ème point pouvez-vous s'il vous plaît donner un exemple de code factice? Je comprends vraiment le concept, mais encore à mettre en œuvre et je n'utilise pas MVC, mais asp.net 3.5 simple, donc comment utiliser une méthode de contrôleur si vous pouvez fournir s'il vous plaît avec un code factice. il serait très utile :(désolé de demander la faveur, mais je n'arrive pas vraiment à comprendre comment implémenter – Joy

+0

Ne doit pas être contrôleur - édité pour dire la méthode de haut niveau - par exemple dans Page_Load. Donc Page_Load devrait ouvrir la transaction, vérifier la base de données pour voir si l'utilisateur est déjà enregistré, sinon, enregistrer les nouveaux détails de l'utilisateur, puis valider la transaction et Response.Redirect à la page indiquant l'inscription réussie. – BonyT

+0

vous voulez dire que je devrais implémenter ihttpModule et ensuite utiliser un peu context.beginrequest event à l'intérieur faire le travail .. et ensuite vérifier si la session existe déjà .. elle se mettrait à jour avec cette session seulement sinon elle dirait que l'utilisateur existe déjà. .. après que lors de son événement context.endrequest il serait simplement effacer de la session locale. c'est comme ça que tu voulais dire? J'ai cherché et trouvé ce lien à un peu b situation pour laquelle. http://adammatusiak.blogspot.com/2010/03/binding-fluent-nhibernate-session-to.html – Joy

Questions connexes