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).
Veuillez passer par http://stackoverflow.com/questions/2480006/what-is-the-difference-between-customerrors-and-httperrors – Amit
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. –
Mais selon votre code si la requête Ajax est là, vous retournez toujours le statut à 500. N'est-ce pas? – Amit