在 ASP.NET MVC Web 应用程序上执行 ASPX 文件
本文关键字:程序上 执行 ASPX 文件 应用程序 应用 ASP NET MVC Web | 更新日期: 2023-09-27 18:31:04
我将尽力在这里解释我的情况。
在我的工作中,我们让整个网站使用基本 ASP.NET,我们通过创建自己的HttpModules
和HttpHandlers
从头开始创建我们自己的自定义 MVC 框架。
这是因为到那时,MVC 甚至不存在(至少在这里),我们谈论的是大约 12 年前。
我们最近试图继续前进,并尝试将我们当前的站点项目升级到新的 ASP.NET MVC 5技术。我们成功地使它工作(显然),同时保持我们的遗留业务逻辑不变。
我们的业务需求促使我们为应用程序中的每个可能请求制定路由,其中包括静态文件请求。
我们为静态请求包含一个捕获全部路由。此路由会将请求委托给我们的自定义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
文件中的代码被执行?它可以以编程方式执行吗?如果是这样,我该怎么做?
能做什么?
前言:我没有 MVC 的经验,但我有 asp.net 的经验。
问题是通过 IIS 的重定向与通过应用程序中的 web.config 重定向不同。基本上,通过 IIS 重定向会将请求类型更改为普通请求而不是 404 请求,从而有效地吞噬了 404 错误。
如何在 MVC 中正确处理 404?ASP.NET 更详细地解释了如何处理 MVC 中的 404 错误。
简短说明:根据您希望如何使用此功能,选择 1:
- 使用 Application_Error() 处理程序;
- 为带有附加视图的 404 错误添加特殊控制器;
- 将自定义错误部分添加到您的 web.config;
- 手动将用户发送到 EndRequest() 处理程序中的错误页面。
由于我没有MVC的经验,因此我不能凭良心推荐这4种方法中的一种作为最佳或最差的方法。我建议您阅读答案(在上面的链接中),看看哪一个最适合您。
另外,我不明白你为什么要使用 MVC,但不要一直将你的错误页面作为视图包含在内。