【问题标题】:.Net RouteTable for images not triggering.Net RouteTable 用于未触发的图像
【发布时间】:2012-07-27 17:19:36
【问题描述】:

我已经在 global.asax 文件中为已移动到数据库的图像设置了一个路由表。当我使用将 EmpImages/[numeric id] 作为基本格式的 url 时,如果我使用与 ~/EmpImages/42 相同的 url,它就可以正常工作,但是我们有数百个硬编码链接是 ~/EmpImages/42 .png。当我尝试使用 EmpImages/[numeric id].png 时,永远不会调用处理程序。

我查看了几个显示 .ext 的示例,但它们使用的是页面路由而不是处理程序。使用下面的代码,您能告诉我我缺少什么吗?

这部分有效:

RouteTable.Routes.Add(new Route("EmpImages/{id}/{size}", new EmployeeImageRouteHandler()));
RouteTable.Routes.Add(new Route("EmpImages/{id}", new EmployeeImageRouteHandler()));

使用网址时:

~/EmpImages/42
~/EmpImages/42/256

但是当我尝试时:

RouteTable.Routes.Add(new Route("EmpImages/{id}/{size}.png", new EmployeeImageRouteHandler()));
RouteTable.Routes.Add(new Route("EmpImages/{id}.png", new EmployeeImageRouteHandler()));

使用网址时:

~/EmpImages/42.png
~/EmpImages/42/256.png

失败了。处理程序永远不会被调用。

我缺少什么简单的东西?

【问题讨论】:

  • 您还指定了哪些其他路线?单独这种类型的路线应该没有问题。在您的第二个示例中,该请求可能与在您的图像处理程序之前注册的路由匹配。尝试将其移动到第一个注册的路线,看看是否有帮助。
  • 目前只有这两条路线。当我使用与 /EmpImages/42 一起使用的第一个示例并将 /EmpImages/42.png 附加到它时,我希望它仍会触发处理程序,但在这种情况下也不会。我确实在某处读到“。”是特殊字符,但在微软文档的其他地方,它们显示了示例,特别是.jpeg,但它们路由到页面,而不是处理程序。创建一个单独的网页可能是一种解决方法,但处理程序理论上应该可以工作
  • 请参阅下面对我的答案的编辑。

标签: c# .net dynamic


【解决方案1】:

根据Route 的文档,您指定路由的方式似乎不受支持。

引用文档:

URL 模式由 HTTP 请求中应用程序名称之后的段组成...每个段由 / 字符分隔。当一个段括在大括号( { 和 } )中时,该段被称为 URL 参数。 ASP.NET 路由从请求中检索值并将其分配给 URL 参数...如果段未括在大括号中,则该值被视为文字值。

显然,它不支持带有混合 URL 参数和文字的段。

您需要让您的 EmployeeImageRouteHandler 在内部处理带有字符串处理的尺寸参数的“.png”扩展名。

编辑:除此之外,在处理带有点 see this StackOverflow question 的 URL 时似乎存在一个已知问题。那里提出的解决方案是包括

<httpRuntime relaxedUrlToFileSystemMapping="true" />

在您的 web.config 中,但这仅适用于 ASP 4.0 和 IIS 7.0 及更高版本。如指定问题中所述,此问题的详细信息在Haacked 上进行了讨论。

【讨论】:

  • 当我使用正常的处理程序时,使用 .png(或任何扩展名),处理程序根本不会被触发。我很乐意去掉尾随的 png/jpeg/whatever,但我什至没有那么远。
  • 嗯。您可以从您的网站加载常规(真实).png 图像吗?也许您的服务器配置为忽略此类请求(例如对 .master 或 .config 文件的请求)
  • 是的,这是一个特殊情况的处理问题。显然 IIS 看到了这个点,假定请求是针对一个真实文件的,并且没有将它传递给 ASP.NET。查看答案中的编辑
【解决方案2】:

据我所知,dmi_above 关于路由解析限制是正确的。但是您可以从那里得出一个简单的解决方法:

如下注册您的路线:

RouteTable.Routes.Add(new Route("EmpImages/{id}/{size}/i.png", new EmployeeImageRouteHandler()));
RouteTable.Routes.Add(new Route("EmpImages/{id}/i.png", new EmployeeImageRouteHandler()));

并请求他们:

~/EmpImages/42/i.png
~/EmpImages/42/256/i.png

【讨论】:

    【解决方案3】:

    问题是您尝试通过路由捕获的路径是静态资源。如果路由所在位置存在文件,则忽略路由。这是设计使然,既可以防止静态 url 引用之间的冲突,又可以防止每个请求都使用路由引擎。

    尝试在您的处理程序中放置一个断点,然后指定一个您知道不存在的 id 以查看是否是这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2017-07-14
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      相关资源
      最近更新 更多