я смог обойти эту проблему, используя следующую настройку в веб-формах asp.net с помощью .NET 3.5.
Шаблон, который я реализовал, обходит специальное настраиваемое решение .NET в файле web.config, поскольку я написал свой собственный, чтобы обрабатывать все сценарии с правильным кодом состояния HTTP в заголовке.
Во-первых, CustomErrors секция Web.config выглядит следующим образом:
<customErrors mode="RemoteOnly" defaultRedirect="~/error.htm" />
Эта установка гарантирует, что режим CustomErrors установлен в положение включено, настройки мы будем нуждаться позже, и предоставляет все остальное терпит неудачу, для параметра defaultRedirect error.htm. Это пригодится, если у меня нет обработчика конкретной ошибки, или что-то похожее на разрыв сломанного соединения с базой данных.
Во-вторых, вот глобальное событие asax Ошибка:
protected void Application_Error(object sender, EventArgs e)
{
HandleError();
}
private void HandleError()
{
var exception = Server.GetLastError();
if (exception == null) return;
var baseException = exception.GetBaseException();
bool errorHandled = _applicationErrorHandler.HandleError(baseException);
if (!errorHandled) return;
var lastError = Server.GetLastError();
if (null != lastError && HttpContext.Current.IsCustomErrorEnabled)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(lastError.GetBaseException());
Server.ClearError();
}
}
Этот код выдав ответственность за обработку ошибок в другой класс. Если ошибка не обрабатывается, и CustomErrors включен, это означает, что у нас есть случай, когда мы работаем, и как-то ошибка не была обработана. Мы очистим его здесь, чтобы пользователь не видел его, но заходите в Elmah, чтобы мы знали, что происходит.
applicationErrorHandler класс выглядит следующим образом:
public bool HandleError(Exception exception)
{
if (exception == null) return false;
var baseException = exception.GetBaseException();
Elmah.ErrorSignal.FromCurrentContext().Raise(baseException);
if (!HttpContext.Current.IsCustomErrorEnabled) return false;
try
{
var behavior = _responseBehaviorFactory.GetBehavior(exception);
if (behavior != null)
{
behavior.ExecuteRedirect();
return true;
}
}
catch (Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
return false;
}
Этот класс в основном использует шаблон команды, чтобы найти соответствующий обработчик ошибок для типа ошибки, которая выдается. Важно использовать Exception.GetBaseException() на этом уровне, потому что почти каждая ошибка будет обернута в исключение более высокого уровня. Например, выполнение «throw new System.Exception()» с любой страницы aspx приведет к получению HttpUnhandledException на этом уровне, а не к System.Exception.
«Фабрика» код прост и выглядит следующим образом:
public ResponseBehaviorFactory()
{
_behaviors = new Dictionary<Type, Func<IResponseBehavior>>
{
{typeof(StoreException),() => new Found302StoreResponseBehavior()},
{typeof(HttpUnhandledException),() => new HttpExceptionResponseBehavior()},
{typeof(HttpException),() => new HttpExceptionResponseBehavior()},
{typeof(Exception),() => new Found302DefaultResponseBehavior()}
};
}
public IResponseBehavior GetBehavior(Exception exception)
{
if (exception == null) throw new ArgumentNullException("exception");
Func<IResponseBehavior> behavior;
bool tryGetValue = _behaviors.TryGetValue(exception.GetType(), out behavior);
//default value here:
if (!tryGetValue)
_behaviors.TryGetValue(typeof(Exception), out behavior);
if (behavior == null)
Elmah.ErrorSignal.FromCurrentContext().Raise(
new Exception(
"Danger! No Behavior defined for this Exception, therefore the user might have received a yellow screen of death!",
exception));
return behavior();
}
В конце концов, я получил расширяемую обработку ошибок настройки схемы. В каждом из определенных «вариантов поведения» у меня есть специальная реализация для типа ошибки. Например, исключение Http будет проверяться для кода состояния и обрабатываться соответствующим образом. Код статуса 404 потребует Server.Transfer вместо Request.Redirect вместе с соответствующим кодом состояния, записанным в заголовке.
Надеюсь, это поможет.
Что говорит браузер? Я использую addon Header Spy для Firefox. – 2008-12-07 06:17:25
Header Spy Response: HTTP/1.1 404 Не найдено Дата: Вс, 07 Дек 2008 06:21:20 GMT – 2008-12-07 06:21:54
Вы используете мастер-страницу? Может быть, все. Я попробую страницу без использования главной страницы ... – 2008-12-07 06:23:12