0

我在 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

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

我错过了什么简单的事情?

4

3 回答 3

1

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

引用文档:

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

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

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

编辑:除此之外,在处理带有点的 URL 时似乎存在一个已知问题,请参阅这个 StackOverflow 问题。提出的解决方案包括

<httpRuntime relaxedUrlToFileSystemMapping="true" />

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

于 2012-07-27T17:53:22.357 回答
0

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

注册您的路线如下:

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
于 2012-07-27T18:37:41.230 回答
0

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

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

于 2012-07-30T13:35:40.833 回答