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

时间:2014-11-19 14:06:52

标签: c# asp.net .net asp.net-mvc httphandler

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

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

可以做些什么?

1 个答案:

答案 0 :(得分:0)

前言:我没有MVC的经验,但我有使用asp.net的经验。

问题是通过IIS的重定向与通过应用程序中的web.config重定向不同。基本上,通过IIS的重定向将请求类型更改为正常请求而不是404请求,从而有效地吞下了404错误。

How can I properly handle 404 in ASP.NET MVC?解释了如何更详细地处理MVC中的404错误。

简短说明:根据您的使用方式,选择1:

  • 使用Application_Error()处理程序;
  • 使用附加视图为404错误添加特殊控制器;
  • 将customErrors部分添加到web.config;
  • 手动将用户发送到EndRequest()处理程序中的错误页面。

由于我没有MVC的经验,我不能在良心上推荐这4种方法中的一种作为最好或最差的方法。我建议你阅读答案(在上面的链接中),看看哪一个最适合你。

另外,我不明白为什么你会选择MVC,但也不会一直把你的错误页面作为一个视图。