Asp.net mvc 使网站离线,但不使用API

Asp.net mvc 使网站离线,但不使用API,asp.net-mvc,asp.net-web-api,Asp.net Mvc,Asp.net Web Api,我有一个ASP.NETMVC网站,它也有web API和OData端点。有没有办法让站点离线,但保持API和OData正常工作 我尝试在根目录下放置App_Offline.htm,但这使所有区域都脱机。编写一个actionfilteratAttribute并将其注册为全局筛选器: public class MyFilterAttribute : ActionFilterAttribute { private string _offlineUrl; public MyFilterA

我有一个ASP.NETMVC网站,它也有web API和OData端点。有没有办法让站点离线,但保持API和OData正常工作


我尝试在根目录下放置App_Offline.htm,但这使所有区域都脱机。

编写一个
actionfilteratAttribute
并将其注册为全局筛选器:

public class MyFilterAttribute : ActionFilterAttribute
{
    private string _offlineUrl;
    public MyFilterAttribute(string offlineUrl)
    {
        _offlineUrl = offlineUrl;
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // considering you have a API controller
        // and you have a Boolean app setting named BringMVCRoutesOffline
        // to activate this filter form web.config 
        // in real world scenario you could check area or what URL
        // or route data you want
        if (Convert.ToBoolean(ConfigurationManager.AppSettings["BringMVCRoutesOffline"])
            && filterContext.RouteData.Values.ContainsKey("controller")
            && !filterContext.RouteData.Values["controller"]
                .ToString().ToLower() == "api"
            // avoiding infinite loop 
            && filterContext.HttpContext.Request
                .AppRelativeCurrentExecutionFilePath != _offlineUrl)
        {
            filterContext.Result = new RedirectResult(_offlineUrl);
        }
    }
}
在应用程序_Start>FilterConfig中添加:

filters.Add(new MyFilterAttribute("~/error/offline"));

将WEB API和OData端点分开部署,以便可以使用
App_Offline.htm
关闭一个应用程序,而不会影响其他部署。您可以使用嵌套IIS应用程序的现有URL来完成此任务。

1)首先:始终使mvc和api类似于2个项目-然后您可以在IIS中停止站点。2) 在你的情况下可能很容易-它只是为网站的评论路由???@David,谢谢你的评论。我现在知道了,但当这整件事在不久前开始时,我并没有想到。因此,目前我只能使用这种结构(直到它发生变化)@David我可以添加一个过滤器来临时重定向到自定义视图(302),但我试图避免重新部署。Ap_离线是一种方便的方式,但也会使服务变得无用。我的问题是,是否有另一种方便的方式只让VIE离线,而不让服务离线。或者,如果您希望使用更方便的方式,可以通过GUI或web添加重写规则。配置如果您查看我对我的问题的评论,如果我想重新部署网站,我会这样做。我喜欢这种方式,但问题是,是否还有其他方式像App_离线。我确实喜欢这种方法,我已经在实施它,因为它似乎不是另一种方式。谢谢。我想补充一点,既然我希望API在MVC离线时可用,我想你应该把答案改成
!filterContext.RoutedData.Values[“controller”].ToString()=“Api”
更进一步,我还建议
。ToLower()=“Api”
甚至
。Equals(“Api”,StringComparison.InvariantCultureIgnoreCase)
我在提交帖子之前就看到了它。通过使用重写扩展,您可以在不重新部署的情况下执行同样的操作。无论如何,这似乎是一个答案。我做了一些研究,还没有找到一种能满足我需要的方法。我真的不想惹IIS。无论如何谢谢你。