为了账号安全,请及时绑定邮箱和手机立即绑定

网址末尾出现“点”时出现“找不到资源。”错误

/ 猿问

网址末尾出现“点”时出现“找不到资源。”错误

繁星淼淼 2019-11-15 13:19:08

我正在使用ASP .NET MVC Beta,当我使用此URL末尾带有“点”的URL时,出现HTTP 404(找不到资源)错误:


http:// localhost:81 / Title / Edit / Code1。


如果删除末尾的点或中间的某点,则不会出现错误。


我尝试调试,但是在MvcHandler中的ProcessRequest之前,我从“ System.Web.CachedPathData.GetConfigPathData(String configPath)”中收到错误。


网址末尾是否不允许使用“点”?还是有办法修复路由定义以处理此URL?


例如:我有一个名为Detail1 [Id(integer),Code(string),Description(string)]的表,该表通过其ID列与Master1具有FK关系。每当我选择Master1的记录时,我也会选择它的Detail1记录以获取它的Code字段。为了不每次都进行此联接(因为通常不仅只有一个细节,而且有多个细节),所以我选择不使用Id列,而是制作Detail1的代码PK。


但是,当我摆脱Id并将Code用作PK时,我的路线也开始与Code字段一起使用,例如:Detail1 \ Edit \ Code1


该代码中可以包含任何内容,也可以包含DOT。在某些情况下,我可以在最后禁止DOT,但有时确实很有意义。


而且我还看过这篇文章,路线可能非常灵活,所以我认为我的想法并不奇怪。


所以这就是为什么我做一些非标准的事情。有什么建议么?


还有为什么在网址末尾有DOT太奇怪了?


查看完整描述

3 回答

?
慕粉4167745

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


<httpRuntime relaxedUrlToFileSystemMapping="true" />

我已经对其进行了测试,并且可以正常工作。Haack对此有一个解释。


查看完整回答
反对 回复 2019-11-15
?
炎炎设计

从1.0及更高版本的每个ASP.NET版本中,都可以通过几种方法解决此问题。我知道创建此线程已经两年了,但是无论如何,它会在这里进行:


原因

创建您的自定义错误处理程序,或在IIS中配置自定义页面以重定向404均无效。原因是ASP.NET认为此URL很危险。在内部System.Web.Util.FileUtil,ASP.NET调用一个private方法IsSuspiciousPhysicalPath,该方法尝试将路径映射到(虚拟但合法的)文件名。


当得到的合法路径与原始路径不相等时,处理将停止,并且ASP.NET代码返回404(它不向IIS或web.config询问自定义404,而是返回一个自身,因此对此很难做)。


Windows资源管理器的工作方式相同。尝试创建以一个或多个点结尾的文件名,即test.txt.。您会发现结果名称为text.txt。


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

解决方案很简单(一旦您知道,它总是如此)。在发出此404之前,它将调用Application_PreSendRequestHeaders,您可以在其中注册一个简单事件Global.asax.cs(或等效于VB)。以下代码将向浏览器返回一个简单的文本,但是重定向或任何其他有效的响应也是可能的。


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。将调用该事件。还要注意,某些路径仍然不起作用(例如,以多个点结尾,带有井号标签或<-符号会导致400错误请求)。再说一次,它确实适用于以引号,空格+斜杠或多个由空格分隔的点结尾。


查看完整回答
反对 回复 2019-11-15
?
米脂

好吧,在.NET 4.5中,我通过在网址末尾添加“ /”来解决此问题。


因此,在您的情况下,它将是“ http:// localhost:81 / Title / Edit / Code1。/”。这是我所做的唯一一件事,无需添加httpRuntime设置。


查看完整回答
反对 回复 2019-11-15
  • 3 回答
  • 0 关注
  • 43 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信