在 ASP.NET MVC Web 应用程序上执行 ASPX 文件

本文关键字:程序上 执行 ASPX 文件 应用程序 应用 ASP NET MVC Web | 更新日期: 2023-09-27 18:31:04

我将尽力在这里解释我的情况。

在我的工作中,我们让整个网站使用基本 ASP.NET,我们通过创建自己的HttpModulesHttpHandlers从头开始创建我们自己的自定义 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文件中的代码被执行?它可以以编程方式执行吗?如果是这样,我该怎么做?

能做什么?

在 ASP.NET MVC Web 应用程序上执行 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,但不要一直将你的错误页面作为视图包含在内。