当前位置:  开发笔记 > 后端 > 正文

"没有找到您要查的资源." 在网址末尾有"点"时出错

如何解决《"没有找到您要查的资源."在网址末尾有"点"时出错》经验,为你挑选了3个好方法。

我正在使用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是如此奇怪?



1> bkaid..:

如果您使用的是.NET 4.0,则可以在web.config的system.web部分设置此标志,并允许它:


我测试了它,它的工作原理.哈克有一个解释.


这样做没有安全性问题吗?

2> Abel..:

这可以通过几种方式在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.

在ASP.NET中以点结尾URL的解决方案

解决方案很简单(一旦你知道它,它总是如此).就在它发出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个错误请求).然后,它确实适用于以引号,空格+斜线或由空格分隔的多个点结束.



3> Nat..:

好吧,在.NET 4.5中我通过在URL的末尾添加"/"来解决这个问题.

因此,在您的情况下,它将是"http:// localhost:81/Title/Edit/Code1./".这是我唯一做的事情,我没有必要添加httpRuntime设置.


你是怎么在最后添加的?
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有