Asp.net MVC- 从请求中获取调整大小的图像 url 获取 404 错误

Asp.net MVC- get resized image from requested url get 404 Error

我在服务器的图像文件夹中有一些图像文件
当 url 请求的图像不存在时,我想获取图像的调整大小版本。
我有代码可以根据原始图像调整图像大小。
但我不知道如何从 url 发送请求时执行此操作,例如
当我键入 http://example.com/Image/a_140_140.jpg 如果有名称为 a.jpg 的文件时,使用我的代码创建一个名称为 a_140_140.jpg 的调整大小的图像,并将其 return 发送给客户端。
但现在我得到 404 Error
请帮助我如何完成这项工作以永远不会出现 404 错误。

我不再在我的应用程序中添加任何路由

能不能试试在IIS中使用404错误转发?

我提供以下解决方案:
我使用 Asp.net MVC,但通过一些更改,您可以将其用于每个站点
1. 将以下行添加到 web.config

  <httpErrors>
     <remove statusCode="404" />
  <error statusCode="404" path="/Home/Http404/" responseMode="ExecuteURL" />
  </httpErrors>

2。将此路线添加到 Routeconfig.cs

       routes.MapRoute(
            "404-PageNotFound",
            "{*url}",
            new { controller = "Home", action = "Http404" });

3。对于控制器代码,请使用此代码:

 [MySite.WebUI.Infrastructure.AjaxCrawlable]
        public ActionResult Index()
        {
            string url = Request.Url.AbsolutePath;
            if (url.LastIndexOf('.') != -1)
            {
                string extention = url.Substring(url.LastIndexOf('.') + 1).ToLower();
                var extentionList = new string[] { "jpg", "png", "gif", "tif" };
                if (extentionList.Contains(extention))
                {
                    try
                    {
                        string path = System.Web.Hosting.HostingEnvironment.MapPath(Request.Url.AbsolutePath);
                        string FileName = System.IO.Path.GetFileNameWithoutExtension(path);
                        string extentionnow = System.IO.Path.GetExtension(path);
                        var _mainpath = Request.Url.AbsolutePath.Substring(0, Request.Url.AbsolutePath.LastIndexOf("/"));
                        string _mainfileName = FileName.Substring(0, (FileName.LastIndexOf('_')));
                        int _imagesize = int.Parse(FileName.Substring((FileName.LastIndexOf('_') + 1)));
                        if (_imagesize != null || _imagesize != 0)
                        {
                            var t = Resize.FindResizeImage("~" + _mainpath + "/" + _mainfileName + extentionnow, _imagesize);
                            return new RedirectResult(Request.Url.AbsolutePath);
                        }
                    }
                    catch
                    {
                        return View();
                    }

                }
            }
            else
                return View();
            return View();
        }
  1. 添加此 class 以调整图像大小

使用系统; 使用 System.Collections.Generic; 使用 System.Drawing; 使用 System.Drawing.Drawing2D; 使用 System.IO; 使用 System.Linq; 使用 System.Web; 使用 System.Web.Mvc;

namespace MySite.WebUI.Models
{
    public static class Resize
    {
        public static string FindResizeImage(string path, int size)
        {

            var _serverpath = HttpContext.Current.Server.MapPath(path);
            if (System.IO.File.Exists(_serverpath))
            {
                var Extention = Path.GetExtension(path);
                var _pathresize = path.Substring(0, path.LastIndexOf(".")) + "_" + size.ToString() + Extention;
                var _serverpathresize = HttpContext.Current.Server.MapPath(_pathresize);

                if (System.IO.File.Exists(_serverpathresize))
                {
                    return _pathresize.Substring(1, _pathresize.Length - 1);
                }
                else
                {
                    Resize.Resizeing(HttpContext.Current.Server.MapPath(path), HttpContext.Current.Server.MapPath(_pathresize), size);
                    return _pathresize;
                }
            }
            return null;
        }
        public static void Resizeing(string imageFile, string outputFile, int size)
        {
            using (var srcImage = Image.FromFile(imageFile))
            {
                using (var newImage = new Bitmap(size, size))
                using (var graphics = Graphics.FromImage(newImage))
                {
                    graphics.SmoothingMode = SmoothingMode.AntiAlias;
                    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    graphics.DrawImage(srcImage, new Rectangle(0, 0, size, size));
                    newImage.Save(outputFile);
                }
            }
        }
    }
}