Реализация страницы "Вниз для обслуживания" - PullRequest
10 голосов
/ 28 сентября 2011

Я знаю, что мы могли бы просто использовать файл app_offline.htm для этого.

Но я хочу иметь возможность получить доступ к веб-сайту, если мой IP равен 1.2.3.4 (например), чтобы я мог провести окончательное тестирование.

if( IpAddress != "1.2.3.4" )
{
    return Redirect( offlinePageUrl );
}

Как мы можем реализовать это в ASP.NET MVC 3?

Ответы [ 4 ]

15 голосов
/ 28 сентября 2011

Вы можете использовать универсальный маршрут с RouteConstraint с проверкой IP:

Убедитесь, что сначала вы выбрали автономный маршрут.

routes.MapRoute("Offline", "{controller}/{action}/{id}",
                new
                    {
                        action = "Offline",
                        controller = "Home",
                        id = UrlParameter.Optional
                    },
                new { constraint = new OfflineRouteConstraint() });

и код ограничения:

public class OfflineRouteConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        // return IpAddress != "1.2.3.4";
    }
}
14 голосов
/ 04 мая 2012

Согласно предложению Макса, это фактическая реализация.

public class MvcApplication : System.Web.HttpApplication
{

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CheckForDownPage());

    }

    //the rest of your global asax
    //....
}
public sealed class CheckForDownPage : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var path = System.Web.Hosting.HostingEnvironment.MapPath("~/Down.htm");

        if (System.IO.File.Exists(path) && IpAddress != "1.2.3.4")
        {
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.Redirect("~/Down.htm");
            return;
        }

        base.OnActionExecuting(filterContext);
    }


}
2 голосов
/ 31 октября 2015

Я получил бесконечный цикл для решения colemn615, поэтому я добавил проверку автономной страницы.

Кроме того, для более поздних версий ASP.NET это разделено на файл FilterConfig.cs в папке App_Start.

public class FilterConfig
{

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CheckForDownPage());

    }

    public sealed class CheckForDownPage : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (HttpContext.Current.Request.RawUrl.Contains("Down.htm"))
            {
                return;
            }

            var path = System.Web.Hosting.HostingEnvironment.MapPath("~/Down.htm");

            if (System.IO.File.Exists(path) && IpAddress != "1.2.3.4")
            {
                filterContext.HttpContext.Response.Clear();
                filterContext.HttpContext.Response.Redirect("~/Down.htm");
                return;
            }

        base.OnActionExecuting(filterContext);
    }
}
2 голосов
/ 28 сентября 2011

Вы можете определить глобальный фильтр, который останавливает все запросы, если они не приходят с вашего IP. Вы можете включить фильтр по конфигурации.

...