我正在尝试构建一个处理器,以友好的方式提供图像,例如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())
);
有谁知道我哪里出错了?
提前致谢。
答案 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匹配,以便人们不能只搜索文件数据库。
此刻文件没有扩展名,这可能会导致问题,但到目前为止 - 只要设置了内容类型),图像就会正确加载。
在我的代码中还有很多工作要做,以便为其他文件类型提供服务,但这种妥协可能会对其他人有用。