你好,
在我的asp.net Web API中,我同时使用GlobalExceptionHandler和CustomExceptionFilter。我认为他们做了同样的工作,向客户端隐藏了实际的错误并发送给他们"HTTP 500-内部服务器错误。请与您的管理员联系。"回复。我想知道是否删除GlobalExcepitonHandler并将Nlog添加到CustomExceptionFilter中,仍然可以发送相同的响应并记录错误吗?您对此有何看法?
UnhandledExceptionLogger无法捕获所有错误,这就是为什么我想在其中之一中添加日志记录的原因。
CustomExceptionFilter:
GlobalExceptionHandler:
UnhandledExceptionFilter:
在我的asp.net Web API中,我同时使用GlobalExceptionHandler和CustomExceptionFilter。我认为他们做了同样的工作,向客户端隐藏了实际的错误并发送给他们"HTTP 500-内部服务器错误。请与您的管理员联系。"回复。我想知道是否删除GlobalExcepitonHandler并将Nlog添加到CustomExceptionFilter中,仍然可以发送相同的响应并记录错误吗?您对此有何看法?
UnhandledExceptionLogger无法捕获所有错误,这就是为什么我想在其中之一中添加日志记录的原因。
CustomExceptionFilter:
C#:
public class CustomExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
base.OnException(actionExecutedContext);
var response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
//Content = new StringContent("An unhandled exception was thrown by service."),
ReasonPhrase = "HTTP 500-内部服务器错误。请与您的管理员联系。"
};
actionExecutedContext.Response = response;
}
}
GlobalExceptionHandler:
C#:
public class GlobalExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
var result = new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent("HTTP 500-内部服务器错误。请与您的管理员联系。"),
ReasonPhrase = "Exception"
};
context.Result = new ErrorMessageResult(context.Request, result);
}
public class ErrorMessageResult : IHttpActionResult
{
private HttpRequestMessage _request;
private readonly HttpResponseMessage _httpResponseMessage;
public ErrorMessageResult(HttpRequestMessage request, HttpResponseMessage httpResponseMessage)
{
_request = request;
_httpResponseMessage = httpResponseMessage;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
return Task.FromResult(_httpResponseMessage);
}
}
}
C#:
public class UnhandledExceptionLogger : ExceptionLogger
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public override void Log(ExceptionLoggerContext context)
{
var timestamp = DateTime.UtcNow;
//NLOG
NLog(logger, context.Exception, timestamp);
}
private void NLog(Logger logger, Exception message, DateTime timestamp)
{
var sb = new StringBuilder();
sb.AppendLine(message.ToString());
sb.AppendLine(timestamp.ToLongDateString());
logger.Error(sb.ToString());
}
}