升级至MVC3.找不到ashx资源.路由问题

本文关键字:资源 路由 问题 ashx 找不到 MVC3 | 更新日期: 2023-09-27 18:30:07

我到处寻找这个问题的解决方案,但都没有找到。我刚刚使用本指南将一个MVC2应用程序升级到MVC3:http://www.asp.net/whitepapers/mvc3-release-notes#upgrading

我还将项目从VS2008升级到了VS2012。IIS 7.5

除了我的Preview.ashx现在给了我找不到的资源外,一切都进行得很完美。当使用查询字符串中的url调用时,该页面应该显示预览图像。我尝试过更改路由、检查控制器名称、在Web设置中设置Specific Page等。我很确定这与路由或升级过程中出错的某些设置有关,但我无法弄清楚。

我在http://localhost/comm 上使用IIS中的虚拟目录进行了站点设置

编辑:我刚刚使用MVC3的新安装重建了网站,但问题仍然存在。重建网站后,我意识到同一目录中有.aspx文件可以正常工作。只有.ashx文件没有正确路由。

全球.asax

public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
    routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");
    routes.MapRoute(
        "Default", // Route name
        "{instance}/{controller}/{action}/{id}", // URL with parameters
        new { instance = "demo", controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }
    protected void Application_Start() {
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);
    }

错误

The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 
Requested URL: /comm/Views/Review/FileViewer.ashx

升级至MVC3.找不到ashx资源.路由问题

我放弃了让ashx工作的尝试,最终只在返回图像的控制器中构建了一个FilesResult操作。ashx接收了一个HttpContext,以便处理图像并返回它。我创建了一个操作,该操作采用一条路径,执行其工作,然后返回图像。.ashx文件和MVC路由有一些不稳定的地方,我无法理解。我的ashx文件都不起作用,但它们都可以作为操作重新构建,所以我想这没什么大不了的。以下是替换Preview.ashx 的操作

public FileResult Preview(string path) {
// Database fetch of image details
try {
    // Get the relative path
    if (!path.IsNull()) {
        // Get the path
        string filePath = path;
        string absolutePath = ...
        // Make sure the the file exists
        if (System.IO.File.Exists(absolutePath)) {
            // Check the preview
            string previewPath = ...;
            // Has preview
            bool hasPreview = true;
            // Check to see if the preview exists
            if (!System.IO.File.Exists(previewPath) || System.IO.File.GetLastWriteTime(previewPath) < System.IO.File.GetLastWriteTime(absolutePath)) {
                try {
                    // Generate preview
                    hasPreview = ...  != null;
                }
                catch (Exception exc) {
                    hasPreview = false;
                }
            }
            // Once the path is handled, set the type
            if (hasPreview) {
                return new FileStreamResult(new FileStream(previewPath, FileMode.Open), "image/png");
            }
            // No preview
            else
                return WriteDefault();
        }
        else
            // Write the default (blank)
            return WriteDefault();
    }
    else {
        return WriteDefault();
    }
}
catch {
    // Write the default (no_photo)
    return WriteDefault();
    }
}
private FileContentResult WriteDefault() {
    // Write the default
    System.Drawing.Bitmap bmp = new Bitmap(25, 25);
    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.FillRectangle(System.Drawing.Brushes.White, 0, 0, 25, 25);
    bmp = new Bitmap(25, 25, g);
    MemoryStream str = new MemoryStream();
    bmp.Save(str, ImageFormat.Png);
    return File(str.ToArray(), "image/png");
}