我会尽力在这里解释我的情况。
在我的工作中,我们的整个网站使用基本的ASP.NET,我们通过创建自己的HttpModules
和HttpHandlers
来创建我们自己的自定义MVC框架。 / p>
这是因为到那个时候,MVC甚至不存在(至少在这里),我们大约在12年左右谈论。
我们最近试图继续前进,并尝试将我们当前的站点项目升级到新的ASP.NET MVC 5技术。我们成功地使其成功(显然),同时保持我们的遗留业务逻辑不受影响。
我们的业务需求促使我们为应用程序中的每个可能请求建立路由,其中包括静态文件请求。
我们为静态请求添加了 catch-all 路由。此路由会将请求委派给我们的自定义StaticResourceHttpHandler
,并执行ProcessRequest
方法:
public void ProcessRequest(HttpContext context) {
string file = routeData.Values["file"].ToString();
string basePath = GetBasePath();
string fullPath = Path.Combine(basePath, file);
var extension = file.Split(new string[] { "." }, StringSplitOptions.None).Last();
context.Response.Clear();
if(File.Exists(fullPath) {
context.Response.ContentType = GetContentType(extension.ToLower());
using (FileStream stream = File.OpenRead(fullPath))
stream.CopyTo(context.Response.OutputStream);
} else
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
}
正如您所看到的,我们的ProcessRequest
只是检查文件系统中是否存在该文件,如果它存在,则返回文件的内容以及正确的Content-Type
标头和HTTP状态代码200 OK
。
到目前为止,这对我们来说效果很好。
我们现在正在部署我们的Web应用程序。我们在IIS上配置了遇到404时,会重定向到错误页面。
我们的错误页面是一个静态aspx
文件。
在我们的aspx
中,我们在开始时有以下几行:
<%
Response.Status = "404 Not Found"
Response.StatusCode = 404
%>
有了这个,我们确保404 Not Found
状态代码与错误页面一起发送,而不是200 OK
。
问题是我们的自定义静态HTTP处理程序不执行此aspx
。实际上,它只是输出了它的内容,状态代码为200 OK
,正如它在代码中所做的那样。
我该如何解决这个问题?如何使aspx
文件中的代码执行?它可以以编程方式执行吗?如果是这样,我该怎么做?
可以做些什么?
答案 0 :(得分:0)
前言:我没有MVC的经验,但我有使用asp.net的经验。
问题是通过IIS的重定向与通过应用程序中的web.config重定向不同。基本上,通过IIS的重定向将请求类型更改为正常请求而不是404请求,从而有效地吞下了404错误。
How can I properly handle 404 in ASP.NET MVC?解释了如何更详细地处理MVC中的404错误。
简短说明:根据您的使用方式,选择1:
由于我没有MVC的经验,我不能在良心上推荐这4种方法中的一种作为最好或最差的方法。我建议你阅读答案(在上面的链接中),看看哪一个最适合你。
另外,我不明白为什么你会选择MVC,但也不会一直把你的错误页面作为一个视图。