2010-04-09 4 views
2

J'ai un service web que j'appelle via ajax qui nécessite que l'utilisateur soit connecté. Dans chaque méthode je veux vérifier si l'utilisateur est connecté et envoyer un code 403 s'ils ne sont pas, cependant quand j'appelle un Response.End() j'obtiens l'erreur "Thread was avorted". Que devrais-je appeler à la place?Asp.Net: Le service Web lance «Thread was avorted»

[WebMethod(true)] 
public string MyMethod() 
{ 
    if(!userIsLoggedIn) 
    { 
      HttpContext.Current.Response.StatusCode = 403; 
      HttpContext.Current.Response.End(); 
    } 
    /* Do stuff that should not execute unless the user is logged in... */ 
    ... 
} 

Répondre

2

Comme il est un WebMethod, la méthode la plus simple est de revenir tout simplement rien. Ce serait un comportement équivalent à la fin de la réponse pour une requête ajax:

[WebMethod(true)] 
public string MyMethod() 
{ 
    if(!userIsLoggedIn) 
    { 
     HttpContext.Current.Response.StatusCode = 403; 
     return null; 
    } 
} 
+0

Est-ce que je lancer une erreur si je renvoie null sur un type non nullable? –

+0

@Master - Il ne devrait pas vous permettre de compiler cela, mais vous pouvez lancer 'default (typeHere)' pour être sûr. –

3

De l'MS Support issue page:

Si vous utilisez la méthode Response.End, Response.Redirect ou Server.Transfer , une ThreadAbortException exception se produit. Vous pouvez utiliser une instruction try-catch pour intercepter cette exception .

Ce comportement est voulu par la conception.

Pour contourner ce problème, appliquez une des méthodes suivantes:

  1. Pour Response.End, appelez la méthode HttpContext.Current.ApplicationInstance.CompleteRequest au lieu de Response.End à contourner la l'exécution de code à l'événement Application_EndRequest .
Questions connexes