2008-09-19 3 views
4

Как известно большинству из вас, если я закрою файл с именем app_offline.htm в корневом приложении asp.net, он принимает приложение в автономном режиме as detailed here.Помощь, необходимая для расширения Asp.Net

Вы также знаете, что, хотя это замечательно, IIS фактически возвращает код 404, когда это происходит, и Microsoft ничего не собирается делать с этим as mentioned here.

Теперь, поскольку Asp.Net в целом настолько расширяем, я думаю, что не должно быть способа преодолеть этот код состояния, чтобы вернуть 503 вместо этого? Проблема в том, что я не знаю, с чего начать искать это изменение.

ПОМОЩЬ!

ответ

5

Обработка app_offline.htm жестко закодирована в трубопроводе ASP.NET, и не может быть изменена: см CheckApplicationEnabled() в HttpRuntime.cs, где он выбрасывает очень не -configurable 404, если приложение считается автономным.

Однако creating your own HTTP module сделать что-то подобное, конечно, банален - OnBeginRequest обработчик может выглядеть следующим образом в этом случае (применение для HttpHandler показано на рисунке, но в HttpModule идее точно так же):

Public Sub ProcessRequest(ByVal ctx As System.Web.HttpContext) Implements IHttpHandler.ProcessRequest 
    If IO.File.Exists(ctx.Server.MapPath("/app_unavailable.htm")) Then 
     ctx.Response.Status = "503 Unavailable (in Maintenance Mode)" 
     ctx.Response.Write(String.Format("<html><h1>{0}</h1></html>", ctx.Response.Status)) 
     ctx.Response.End() 
    End If 
End Sub 

Это, конечно же, отправная точка: если вы сделаете возвращенный HTML немного дружелюбнее, вы также сможете отобразить хорошую страницу «мы вернемся» для ваших пользователей.

+0

Это, я думаю, это то, на что я надеялся, это не так. Я думаю, что я прочитал в статье Скотта Гута, что есть события, выставленные конвейером для чего-то вроде этого. Теперь, интересно, действительно ли это жестко закодировано. – Vaibhav 2008-09-19 10:26:18

1

Вы можете попробовать отключить его в web.config.

<httpRuntime enable = "False"/> 
1

Вы, вероятно, могли бы сделать это, написав свой собственный HTTP Handler (компонент .NET, который реализует интерфейс System.Web.IHttpHandler).

Там хороший праймер статья здесь: link text

+0

Это не будет работать, не так ли? Поскольку этот метод даже не позволяет загружать App Domain, поэтому я думаю, что обработчик HTTP никогда не будет вызван. – Vaibhav 2008-09-19 10:24:56

0

Преимущество app_offline.htm и httpRuntime enable = "False", выделенное в 1-й ссылке в исходном вопросе, заключается в том, что домен приложения приложения больше не загружен, что может быть желательно для существенных изменений сайта. Небольшая модификация ответа leppie (которая все еще служит 404) заключается в том, чтобы добавить defaultRedirect на другой веб-сайт, который позволит исходному сайту находиться в выключенном состоянии, тогда целевой сайт будет служить простой странице генерации 503.

web источник сайт .config

<httpRuntime enable="false" /> 
<customErrors mode="On" defaultRedirect="/maintainance.aspx"/> 

maintainance.aspx в Dest сайте

<%@Page Language="C#"%> 
<% 
    Response.StatusCode = 503; 
    Response.Write("App offline for maintainance"); 
%> 
Смежные вопросы