.net &引用;找不到该资源。”;出现“时出错”;点“;在url的末尾

.net &引用;找不到该资源。”;出现“时出错”;点“;在url的末尾,.net,asp.net-mvc,routing,routes,.net,Asp.net Mvc,Routing,Routes,我使用的是ASP.NET MVC Beta版,当我使用这个url时出现HTTP 404(找不到资源)错误,该url末尾有一个“点”: 如果我在最后删除点,或者点在中间的某个地方,我就不会得到错误。 我试图调试,但在MvcHandler中ProcessRequest之前,我从“System.Web.CachedPathData.GetConfigPathData(String configPath)”中得到错误 url末尾不允许有“点”吗?或者有没有办法修复路由定义来处理此url 例如:我有一

我使用的是ASP.NET MVC Beta版,当我使用这个url时出现HTTP 404(找不到资源)错误,该url末尾有一个“点”:

如果我在最后删除点,或者点在中间的某个地方,我就不会得到错误。

我试图调试,但在MvcHandler中ProcessRequest之前,我从“System.Web.CachedPathData.GetConfigPathData(String configPath)”中得到错误

url末尾不允许有“点”吗?或者有没有办法修复路由定义来处理此url


例如:我有一个名为Detail1[Id(integer)、Code(string)、Description(string)]的表,它通过Id列与Master1具有FK关系。每当我选择Master1的记录时,我也会选择它的Detail1记录来获取它的代码字段。为了避免每次都加入(因为通常不是只有一个细节,而是有多个细节),我选择不使用Id列,并将代码PK设置为Detail1

但当我去掉Id并使用代码作为PK时,我的路由也开始使用代码字段,如:Detail1\Edit\Code1

该代码可以包含任何内容,也可以包含任何内容,包括点。有些情况下,我可以在结尾处禁止一个点,但有时它真的很有意义

我也看到了这一点,路线可以非常灵活,所以我不认为我的路线很奇怪

这就是为什么我做了这么不标准的事情。有什么建议吗


还有为什么在url的末尾有一个点是如此奇怪?

也许
http://localhost:81/Title/Edit/Code1%2E
就行了


我用十六进制ascii码逃过了这个周期。

为什么不能使用以点结尾的URI

因为URI是一个资源请求,并且在所有相关的操作系统上都存在一个,所以点字符就是。最后一个点被视为表示文件扩展名,因此点终止将毫无意义

也值得一读:


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

<httpRuntime relaxedUrlToFileSystemMapping="true" />


我已经测试过了,效果很好。有一个解释

在1.0及更高版本的每个ASP.NET版本中,都可以通过几种方法解决此问题。我知道这条线索已经创建两年了,但不管怎样,它是这样的:

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

当生成的合法化路径不等于原始路径时,处理停止,ASP.NET代码返回一个404(它不会向IIS或web.config请求自定义404,而是返回一个自己的404,这使得对此很难执行操作)

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

ASP.NET中以点结尾URL的解决方案 解决方案很简单(一旦你知道了,它总是很简单)。就在它发出404之前,它将调用一个简单的事件,您可以在
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的一部分时,此代码也可以工作。即。我将称之为那个事件。还要注意的是,有些路径仍然不起作用(例如,以多个点结束,以散列标记结束,或以<-号结束,会导致400错误的请求)。同样,它也适用于以引号、空格+斜杠或以空格分隔的多个点结尾。

在.NET 4.5中,我通过在url末尾添加“/”解决了这个问题

因此,在你的情况下,它将是“http://localhost:81/Title/Edit/Code1./". 这是我做的唯一一件事,我不必添加httpRuntime设置。

将此添加到处理程序

  <add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi"
 path="api/*"
 verb="*"
 type="System.Web.Handlers.TransferRequestHandler"
 preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>


不起作用。大多数浏览器将%2E更改回。在发送请求之前,因为它是无保留字符。RFC3986对此没有说明。请参阅第3.3节,其中明确指出“……一般语法认为路径段是不透明的。”URI中没有扩展分隔符。您错误地将文件名与URI混淆。它们不一样。谢谢,升级到4.0时请记住。有没有可能为.NET 3.5提供一种解决方案?@Jason:是的,有一种为旧版.NET提供的解决方案,看看我的答案。你知道吗?这会允许以句点结尾的url转发到iis7.5中的url重写模块吗?这就是我现在最要命的事情。这样做不存在安全问题吗?我不相信这是一个安全问题。根据MSDN,设置只是:>“指示HTTP请求中的URL是否必须是有效的Windows文件路径。”不确定这是否仍然适用于您,但我为较旧的ASP.NET版本添加了实际解决方案,请查看;)。如果您想在问题中添加其他信息,只需编辑您的问题(单击问题下方的“编辑”链接)。要对收到的答案进行评论,请使用答案下的评论工具。如果您发现注释空间不足,可能应该进行编辑。答案应该是,直接回答你的问题。这可能在mvc中也适用,对吗?那太好了。@boomhauer:是的,不管你是否使用MVC都没关系。太棒了,如果上面的relaxedurl不起作用,我会回到这个问题上来。thanks@boomhauer:这取决于您可以使用的.NET版本
relaxedull
是否有效。此外,在那些需要更多控制的情况下(如:deny al