问题
当我手动将HTTP Status
我的响应流设置为404
或503
时,IIS 会呈现股票 IIS 内容/视图,而不是我的自定义视图。
当我使用 Web 开发服务器(AKA. Cassini)执行此操作时,它可以正常工作(即显示我的内容并且response.statuscode
== 我输入的数据)。
有什么办法可以覆盖这种行为?
如何复制
制作一个默认的 ASP.NET MVC1 Web 应用程序。添加以下路线
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{*catchall}",
new { controller = "Home", action = "Index" }
);
}
现在将 HomeController 的 Index 方法替换为...
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
Response.StatusCode = 404;
return View();
}
}
好的 - 找到了答案。正如我所料,IIS 正在劫持我的非 200 响应。不确定(即,我不确定这是否是默认行为,或者是因为在机器配置中更新了团队成员之一的设置,等等......)。
无论如何,这里的关键是告诉 IIS不要处理任何非 200 状态结果资源。
如何?web.config 中的配置条目。
现在,这里的关键是
existingResponse="PassThrough"
。如果 HTTP 状态码 != 200,那个坏男孩会告诉 IIS 不理会我的资源。想要更多信息?当然:在官方 IIS 网站上阅读有关此元素的更多信息。
绕过它的另一种方法是在您的 ASP 应用程序中运行以下代码:
来源:https ://stackoverflow.com/a/21271085/238753
一般来说,要小心这种方法。您不应该呈现 404 状态的视图。
我认为当返回错误状态代码时,IIS 返回向它注册的状态错误页面 - 而不是处理的输出。因此,您可以在那里放置一个 HTML 页面(或一个指向 aspx 页面的链接)。 http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx 很好地解释了如何设置错误页面。
但这无关紧要。默认情况下,相当多的浏览器不显示该输出,而是在浏览器中设置了一些内容。因此,如果您依靠人们看到您的 404 页面 - 这可能不会发生。他们可能会看到在浏览器中为他们设置的 404 页面。