asp.net-mvc - 通过mvc路由图像路径

标签 asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我目前正在创建一个 MVC4 Web 应用程序。该应用程序显示包含图像的产品。我请了一家公司来审查该网站的 SEO 方面,他们回来后提出了有关产品图片的建议。

目前我的图像路径是:folder/images/productimage/PROD_98713204_LARGE.gif

他们推荐了以下内容:/folder/images/productimage/98713204-160x260-0-0_My+Product+Name.gif

我遇到的问题是网站上有大量图像,因此很难重命名所有图像以包含产品名称等。因此我考虑使用 MVC 中的路由功能,在html 标记,但从文件系统中选择上面显示的当前图像路径。

我有两个问题:

  • 使用此类路由来管理图像路径是否会对性能产生影响?我的网站将有大量流量负载和大量图像,因此这是一个问题。
  • 有人能给我一个实现上述目标所需配置的路线示例吗?

最佳答案

为了执行路由选项,您必须制定一些有关网址如何映射到实际图像的规范。我们正在谈论多少图像? 1000?一万?一百万?如果您的文件少于 100,000 个,那么我可能会继续使用您已经编写的规范来重命名所有文件,然后从现在开始在进入文件系统的过程中使用该规范来命名文件。

该系统的优点是它限制了数据更改的范围,并且您只需影响系统的一个点(当文件正在传入时)。就性能而言,即使对于大量请求,将一个字符串映射到另一个字符串的开销也可能可以忽略不计。短字符串的字符串操作非常快,但无论如何,如果请求开始花费太长的时间,您应该分析整个请求并关注主要痛点。当然,如果您只是重命名文件,则可以确定您不必担心任何此类分析。

至于创建路由来映射 URL,您首先必须让 ASP.NET 将请求传递给您的代码。默认情况下,ASP.NET 首先检查文件是否存在于 url 指定的位置,如果存在,则仅根据 IIS 中注册的处理程序处理该文件。我的建议是保留这些设置不变,因为当您更改它们时,它们会对系统造成很大的更改。对于图像,处理程序只是尝试将文件发送到客户端。

如果磁盘上不存在该文件,则会通过迭代路由集合来查找请求的处理程序,通常在 Global.asax 中将路由注册到该集合中。由于您没有告诉我们您尝试过什么,所以我假设您知道路线是如何工作的。您可以非常巧妙地使用路线,但我会坚持简单的事情:

routes.MapRoute(
    name: "images",
    url: "{folder}/images/productimage/{unmappedFileName}",
    defaults: new { controller = "Home", action = "Images" }
);

此路线将与您提供的示例网址相匹配。然而,在他们使用实际文件名的情况下,这条路线将永远不会被命中,正如我上面所解释的。然而,由于 SEOed 文件名不存在,因此该路由将被命中,并且它将尝试在 Home Controller 上运行“图像”操作(我在此处列出了整个 Home Controller ,以消除有关这些位置的任何混淆)零件去):

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Images(string unmappedFileName)
    {
        if (String.IsNullOrWhiteSpace(unmappedFileName))
        {
            return HttpNotFound();
        }

        var fileName = MapFileName(unmappedFileName);
        var diskLocation = GetDiskLocation(fileName);
        return File(diskLocation, "image/png");
    }

    private string MapFileName(string unmappedFileName)
    {
        return unmappedFileName + ".png";
    }

    private string GetDiskLocation(string fileName)
    {
        var fullPath = String.Format("~/Content/themes/base/images/{0}", fileName);
        var diskLocation = Server.MapPath(fullPath);
        return diskLocation;
    }
}

显然,您需要将文件名映射更新为您决定的任何规范。我使用此处的内容是因为当您创建新的 MVC4 项目时,该文件夹中有一堆示例文件。

证明它有效的一个简单方法是在主文件夹中实现索引 View ,如下所示:

{
    ViewBag.Title = "Index";

    var imagesDirectory = Server.MapPath("~/Content/themes/base/images/");
    var imageFileNames = Directory.GetFiles(imagesDirectory).Select(m => m.Replace(imagesDirectory, "").Replace(".png", ""));
}

<h2>Index</h2>

@foreach (var imageFileName in imageFileNames)
{
    <div>@Html.ActionLink(imageFileName, "Images", new { unmappedFileName = imageFileName })</div>
}

以后遇到这样的问题,先想办法解决。当您提出问题时,请务必告诉我们您已经尝试过什么,以便我们可以帮助您渡过下一个难关并为您指明正确的方向,而不是仅仅向我们索要解决您问题的代码。如果您不知道从哪里开始,请尝试搜索或询问 a more abstract question 。谁知道呢,他们甚至可能同时回答您的其他问题。 :)

最后,这个解决方案非常复杂。我什至不知道你的映射函数将如何工作,但我知道这很复杂。它还在调试时增加了一层复杂性,因为现在您拥有的 url 与磁盘上的文件名不直接相关,并且该时间稍后会增加。当然,我可能会赞成这种映射,这是有原因的,最值得注意的是,如果您打算在将来更改 url 结构以进行进一步的 SEO 更改,但随后您会破坏互联网上的 url,该死的为了那个原因。所以说真的,如果可行的话,我建议更改所有文件名。

关于asp.net-mvc - 通过mvc路由图像路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13941997/

相关文章:

c# - MVC Paypal 集成

.net - 使用自定义模型绑定(bind)器绑定(bind)非顺序列表

c# - 如何在 ASP.Net MVC 中将 RDLC 报告与 ReportViewer 控件一起使用?

asp.net-mvc - MVC4 中的 VB 强类型模型访问

c# - ASP.NET MVC Helpers,为模型的两个属性创建帮助器

c# - 为 SEO 友好的博客正确设置自定义路由

asp.net - ASP.Net MVC 中静态文件的永久重定向旧路由

jquery - ASP.NET MVC 3 - ViewModel 和刷新 - 问题

c# - Intranet 应用程序中的 SimpleMembership

c# - MVC 路由的许多可选参数