我目前正在创建一个 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/