2017-01-24 1 views
0

Je suis responsable de toutes les erreurs dans les contrôleurs utilisant la HandleError Attribute que je l'ai modifié pour des http et ajax demandes et de les manipuler comme un type d'erreur 500.erreurs de poignée pour Http et les requêtes Ajax en utilisant HandleError Attribut classe

public class HandleExceptionsAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.ExceptionHandled) 
      return; 
     else 
     { 
      ErrorLogger.LogException(filterContext); 

      if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null) 
      { 
       filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 

       filterContext.Result = new JsonResult 
       { 
        Data = new 
        { 
         success = false, 
         message = "error", 
        }, 
        JsonRequestBehavior = JsonRequestBehavior.AllowGet 
       }; 
      } 
      else 
      { 
       base.OnException(filterContext); 
      } 

      filterContext.ExceptionHandled = true; 
      filterContext.HttpContext.Response.Clear(); 
     } 
    } 
} 

et son utilisation en tant que chaque contrôleur:

[HandleExceptions] 
public class InvoiceController : Controller 
{} 

je également le mode sur les customErrors dans web.config que:

<customErrors mode="On" > 
    <error statusCode="400" redirect="Home/Error400" /> 
    <error statusCode="401" redirect="Home/Error401" /> 
    <error statusCode="403" redirect="Home/Error403" /> 
    <error statusCode="500" redirect="/Home/Error" /> 
</customErrors> 

et les httpErrors que:

<httpErrors errorMode="Custom" existingResponse="Replace"> 
    <!--<remove statusCode="404" subStatusCode="-1" />--> 
    <error statusCode="404" path="/Home/Error404" responseMode="ExecuteURL"/> 
    <!--<remove statusCode="500" subStatusCode="-1" />--> 
    <error statusCode="500" path="/Home/Error" responseMode="ExecuteURL"/> 
</httpErrors> 

Le problème avec moi est Au moment où je décommente simplement la balise remove pour le code d'état, cela fonctionne très bien avec httpErrors mais pas avec la requête ajax car au lieu de renvoyer le code d'état, il renvoie la page Home/Error. Mais si je commente cette balise, alors httpErrors ne renvoie pas la page d'erreur dans la plupart des cas mais fonctionne bien pour une requête ajax que je peux obtenir dans statusCode.

$.ajax({ 
      url: "@Url.Action("SomeAction", "SomeController")", 
      type: "POST", 
      async: true, 
      cache: false, 
      data: JSON.stringify(data), 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (response) { 
       if (response.success) { 
        catchSuccess("Success", response.responseText); 
       } 
       else { 
        catchWarning("Error", response.responseText); 
       } 
      }, 
      Error: function (ex) { 
       catchError("Unkown Error", "Contact the Administrator"); 
      }, 
      statusCode: { 
       500: function() { 
        catchError("Error 500", "Internal Server Error. Contact the Administrator"); 
       }, 
       403: function() { 
        catchError("Error 403", "Internal Server Error. Contact the Administrator"); 
       }, 
       404: function (response) { 
        catchError("Error 404", "Internal Server Error. Contact the Administrator"); 
       } 
      } 
     }); 

Que dois-je faire pour détecter les deux erreurs latérales? Ajax demande des erreurs: Je veux retourner le code d'état Http request errors: Je veux retourner la page d'une action. (Accueil/Erreur).

+0

Veuillez passer par http://stackoverflow.com/questions/2480006/what-is-the-difference-between-customerrors-and-httperrors – Amit

+0

Je ne suis pas seulement en train de gérer les erreurs http, mais je dois aussi obtenir le code d'état demande ajax pour gérer correctement les erreurs. –

+0

Mais selon votre code si la requête Ajax est là, vous retournez toujours le statut à 500. N'est-ce pas? – Amit

Répondre

0

Comme il fonctionne, je poste la solution comme réponse. Pour le problème ci-dessus au lieu de vérifier l'erreur de vérification du code d'état dans Jquery AJAX. Sysntax pour le même est

error:Function(jqXHR jqXHR, String textStatus, String errorThrown). 

Essayez de vous connecter à la console ou la sortie d'alerte pour vérifier le résultat souhaité à manipuler.

Et si vous voulez gérer une réponse spécifique, lancez une erreur spécifique non générique.

+0

Merci mon pote, en plus j'ai besoin de retourner le résultat json de l'attribut HandleError car par défaut cet attribut trouve et renvoie [** page d'erreur **] (https://msdn.microsoft.com/fr-fr/library/system.web .mvc.handleerrorattribute (v = vs.118) .aspx) et j'ai besoin de json result pas la page. –

+1

C'est ce dont je parlais. Comme vous avez spécifié le code d'état comme 500 dans HandleError, il correspond à votre configuration afin que la page d'erreur soit renvoyée. Si vous spécifiez le code de retour en tant que code personnalisé. J'espère que vous pourrez obtenir le résultat JSON. – Amit

+0

pourriez-vous s'il vous plaît fournir un échantillon? –