具有Url重写的MVC图像处理程序

时间:2013-04-03 15:48:25

标签: asp.net-mvc image url-rewriting handler

我正在尝试构建一个处理器,以友好的方式提供图像,例如http://mydomain.com/images/123/myimage.jpg甚至...... / 123 / myimage

在使用.NET Forms和ashx文件之前,我之前已经这样做了。

我现在正在使用MVC 4(我是新手)并且我正在尝试做同样的事情。我重复使用了很多旧代码,并在我的项目中添加了一个ashx文件,并通过查询字符串成功生成了我的图像。但是,我无法让Url Rewrite工作!

在我使用的旧代码中:

        RouteTable.Routes.MapHttpHandlerRoute("imagestoret", "imagestore/{fileId}", "~/Images/ImageHandler.ashx");
        RouteTable.Routes.Add(new Route("imagestore/{fileId}", new PageRouteHandler("~/Images/ImageHandler.ashx")));

MapHttpHandlerRoute是在互联网上找到的包含以下内容的自定义类:

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        if (!string.IsNullOrEmpty(_virtualPath))
        {
            return (IHttpHandler)System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(_virtualPath, typeof(IHttpHandler));
        }
        else
        {
            throw new InvalidOperationException("HttpHandlerRoute threw an error because the virtual path to the HttpHandler is null or empty.");
        }
    }

从那时起,我尝试将其转换为使用查询字符串成功运行的Controller,但是,当我尝试在其中添加路由时,仍会返回404错误。

routes.MapRoute(
            "ImageProvider",
            "imagestore/{fileId}/",
            new { controller = "File", action = "GetFile", id = UrlParameter.Optional });

我也尝试过来自互联网的ImageRouteHandler:

    public class ImageRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        // Do stuff
    }
}

然后将以下内容添加到我的RouteConfig.cs中:

        routes.Add("MyImageHandler",
            new Route("imagex/{fileId}",
            new ImageRouteHandler())
        );

有谁知道我哪里出错了?

提前致谢。

1 个答案:

答案 0 :(得分:2)

我还没有找到完美的解决方案,但要妥协。没有{controller}方面,我根本无法让路由工作。所以我最终做的就是添加一条新路线:

        routes.MapRoute(
            "FileProvider",
            "{controller}/{action}/{id}/{name}",
            new { controller = "File", action = "GetFile", id = UrlParameter.Optional },
            new[] { "mynamespace.Controllers" }
        );

这允许路由到我的控制器> FileController> GetFile方法,例如

    public FileResult GetFile(int id, string name)
    {
        DB.UploadedFile file;

        file = DB.UploadedFile.GetFile(4, DB.UploadedFile.UploadedFileType.IMAGE, id, name);

        if (file != null && DB.UploadedFile.IsImage(file.Filename))
        {
            ImageFormat imgFormat = GetImageFormat(file.Extension);

            if (imgFormat != ImageFormat.Icon)
            {
                return File(file.FileContentsAsByteArray, file.ContentType);
            }
        }
        return null;
    }

所以这允许我提供如下图像:

http://mydomain.com/File/GetFile/1/DogsAndCats

代码确保id和name匹配,以便人们不能只搜索文件数据库。

此刻文件没有扩展名,这可能会导致问题,但到目前为止 - 只要设置了内容类型),图像就会正确加载。

在我的代码中还有很多工作要做,以便为其他文件类型提供服务,但这种妥协可能会对其他人有用。