2

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

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

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

我在 IIS 中使用虚拟目录设置站点http://localhost/comm

编辑: 我刚刚使用全新安装的 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
4

1 回答 1

0

我放弃了尝试让它ashx工作,最终只是FilesResult在控制器中构建了一个返回图像的动作。ashx正在接收一个HttpContext以便处理图像并将其返回。我创建了一个动作,它采用路径、执行其工作并返回图像。文件和 MVC 路由有.ashx一些我想不通的地方。我的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");
}
于 2013-09-04T17:43:26.917 回答