Je pense qu'ASP.Net lance une nouvelle réponse après ApplicationError, juste pour une autre page de gestion des erreurs. Essayez de virer de bord dans cette réponse.
Mise à jour OK: Voici comment procéder! Je voulais m'assurer que nous pouvions joindre un gestionnaire d'erreur et que nous pouvions gérer l'événement avec élégance dans une page, donc nous ne pouvons pas rendre la dernière erreur de serveur nulle, et nous voulons aussi pouvoir ajouter des en-têtes !
En web.config, ajoutez:
<customErrors redirectMode="ResponseRewrite" mode="On">
<error statusCode="500" redirect="~/ErrorHandler.aspx"/>
</customErrors>
Ou tout erreur que vous spécifiquement cherchent à attraper. Et sous httpModules:
<add name="ErrorModule" type="TestErrorLifecycle.ErrorModule, TestErrorLifecycle"/>
Le code pour enregistrer l'erreur est dans ce module:
public class ErrorModule : IHttpModule
{
private volatile object locker = new object();
public void Init(HttpApplication context)
{
context.Error += context_Error;
}
void context_Error(object sender, EventArgs e)
{
var app = sender as HttpApplication;
lock (locker)
{
assertLogDirectory(app.Server);
using (var fs = File.AppendText(app.Server.MapPath("~/logs/errorlog.txt")))
{
var lastException = app.Server.GetLastError();
if (lastException == null) throw new ApplicationException("Not expected...");
fs.WriteLine(lastException.Message);
}
}
// we could also do a Request.Redirect() here...
}
private void assertLogDirectory(HttpServerUtility server)
{
var logdir = server.MapPath("~/logs/");
if (!Directory.Exists(logdir))
Directory.CreateDirectory(logdir);
}
public void Dispose()
{
}
}
Je viens d'écrire au système de fichiers. Vous pouvez utiliser des transactions de fichiers noyau ou un verrou exclusif ou autre, mais comme je sais que je n'écrirai dans ce fichier qu'à partir d'ici, j'ai choisi un simple sémaphore privé.
J'ajouté ceci dans Default.aspx.cs juste pour tester:
protected void Page_Load(object sender, EventArgs e)
{
throw new ApplicationException("wtf, something wrong??!");
}
fichier créé avec ce ErrorHandler.aspx en elle (certaines parties omises pour la brièveté):
<body>
<h2>Error handler</h2>
<form id="form1" runat="server">
<p>Last error: <asp:Label ID="lblError" runat="server" /></p>
</form>
</body>
Et voici la page classe:
public partial class ErrorHandler : Page
{
public ErrorHandler()
{
Load += ErrorHandler_Load;
}
private void ErrorHandler_Load(object sender, EventArgs e)
{
Response.AddHeader("X-TESTING", "Yes it works...");
lblError.Text = Server.GetLastError() == null ? "noo, why is it null?!?" : Server.GetLastError().Message;
}
}
Enfin, je reçois ces en-têtes de réponse à la ErrorHandler.aspx:
Server: ASP.NET Development Server/9.0.0.0
Date: Mon, 23 Feb 2009 00:37:45 GMT
X-AspNet-Version: 2.0.50727
X-TESTING: Yes it works...
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 725
Connection: Close
200 OK
Si vous essayez d'ajouter à Response.Headers-collection directement vous devez exécuter IIS en mode pipeline: http://forums.asp.net/p/1253457/2323117.aspx
J'espère que cela aide! Bravo Henrik
Avez-vous des conseils sur la façon de procéder? –
Oui, je vais faire un test. – Henrik