我正在使用ASP .NET MVC Beta,当我使用这个最后有一个"点"的url时,我得到HTTP 404(无法找到资源)错误:
http:// localhost:81/Title/Edit/Code1.
如果我在末尾删除点或点在中间某处我没有得到错误.
我尝试调试,但它在MvcHandler中的ProcessRequest之前从"System.Web.CachedPathData.GetConfigPathData(String configPath)"得到错误.
网址末尾不允许使用"点"吗?或者有没有办法修复路由定义来处理这个URL?
举个例子:我有一个名为Detail1 [Id(整数),Code(string),Description(string)]的表,它与Master1通过它的Id列有FK关系.每当我选择Master1的记录时,我也会选择它的Detail1记录来获取它的Code字段.为了不每次都进行这种连接(因为通常不仅有一个细节,还有不止一个)我选择不使用Id列,而是制作Detail1的Code PK.
但是当我摆脱Id并使用Code作为PK时,我的路由也开始使用Code字段,如:Detail1\Edit\Code1
本规范可以包含任何内容或最终内容,包括DOT.在某些情况下,我可以在最后禁止DOT,但有时它确实很有意义.
而且我也看到这篇帖子说路线非常灵活,所以我觉得我的路线不那么奇怪.
所以这就是为什么我做一些非标准的事情.有什么建议?
还有为什么在网址末尾有一个DOT是如此奇怪?
如果您使用的是.NET 4.0,则可以在web.config的system.web部分设置此标志,并允许它:
我测试了它,它的工作原理.哈克有一个解释.
这可以通过几种方式在1.0及以上的每个ASP.NET版本中解决.我知道这个线程创建后的两年,但无论如何,它在这里:
创建自定义错误处理程序,或在IIS中配置自定义页面以重定向404将不起作用.原因是ASP.NET认为此URL很危险.在内部System.Web.Util.FileUtil
,ASP.NET调用私有方法IsSuspiciousPhysicalPath
,该方法尝试将路径映射到(虚拟但合法的)文件名.
当生成的合法化路径不等于原始路径时,处理停止并且ASP.NET代码返回404(它不会向IIS或web.config请求自定义404,它会返回一个自己,这使得它如此很难对此做点什么).
Windows资源管理器的工作方式相同.尝试创建以一个或多个点结尾的文件名,即test.txt.
.你会发现结果名称是text.txt
.
解决方案很简单(一旦你知道它,它总是如此).就在它发出404之前,它会调用Application_PreSendRequestHeaders
一个简单的事件,你可以注册到Global.asax.cs
(或等效的VB).以下代码将向浏览器返回一个简单文本,但也可以使用Redirect或任何其他有效响应.
protected void Application_PreSendRequestHeaders(object sender, EventArgs e) { HttpResponse response = this.Context.Response; HttpRequest request = this.Context.Request; if (request.RawUrl.EndsWith(".")) { response.ClearContent(); response.StatusCode = 200; response.StatusDescription = "OK"; response.SuppressContent = false; response.ContentType = "text/plain"; response.Write("You have dot at the end of the url, this is allowed, but not by ASP.NET, but I caught you!"); response.End(); } }
注意:当"aspx" 不是 URL的一部分时,此代码也有效.即,http://example.com/app/somepath.将召集该事件.另请注意,某些路径仍然无效(以多个点结尾,使用哈希标记或<-sign,例如,会导致400个错误请求).然后,它确实适用于以引号,空格+斜线或由空格分隔的多个点结束.
好吧,在.NET 4.5中我通过在URL的末尾添加"/"来解决这个问题.
因此,在您的情况下,它将是"http:// localhost:81/Title/Edit/Code1./".这是我唯一做的事情,我没有必要添加httpRuntime设置.