我有一个项目,要求我的url在路径上有圆点。例如,我可能有一个URL,例如www.example.com/people/michael.phelps

带有点的url会生成404。我的路由是好的。如果我传入michaelphelps,没有点,那么一切正常。如果我加一个点,就会得到404错误。示例站点运行在Windows 7和IIS8 Express上。URLScan未运行。

我尝试在我的web.config中添加以下内容:

<security>
  <requestFiltering allowDoubleEscaping="true"/>
</security>

不幸的是,这并没有什么不同。我刚刚收到一个404.0未找到错误。

这是一个MVC4项目,但我不认为这是相关的。我的路由工作得很好,我所期望的参数都在那里,直到它们包含一个点。

我需要配置什么才能在我的URL中有圆点?


当前回答

这是我在iis7.5和. net Framework 4.5环境中发现的404错误的最佳解决方案,并且不使用:runAllManagedModulesForAllRequests="true"。

我关注了这个帖子:https://forums.asp.net/t/2070064.aspx?Web+API+2+URL+routing+404+error+on+IIS+7+5+IIS+Express+works+fine,我已经修改了我的网站。现在MVC web应用程序在iis7.5和. net Framework 4.5环境下工作得很好。

其他回答

这就像将path="."更改为path=""一样简单。只需在web.config中删除ExensionlessUrlHandler-Integrated-4.0路径中的圆点。

这是一篇不错的文章https://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application

是否可以更改URL结构? 为了我的工作,我尝试了一条路线

url: "Download/{fileName}"

但它对任何有。在里面。

我把路线换成了

    routes.MapRoute(
        name: "Download",
        url:  "{fileName}/Download",
        defaults: new { controller = "Home", action = "Download", }
    );

现在我可以输入localhost:xxxxx/File1.doc/Download,它可以正常工作。

我在视图中的助手也注意到了这一点

     @Html.ActionLink("click here", "Download", new { fileName = "File1.doc"})

也会生成到localhost:xxxxx/File1.doc/Download格式的链接。

也许你可以在路由的末尾放一个不需要的单词,比如“/view”或action,这样你的属性就可以以/结尾的/结尾,比如/mike.smith/view

根据保留URI而不使用查询字符串的重要性,也可以将带有圆点的值作为查询字符串的一部分,而不是URI。

例如,www.example.com/people?name=michael.phelps将工作,无需更改任何设置或任何东西。

您失去了拥有干净URI的优雅性,但此解决方案不需要更改或添加任何设置或处理程序。

只需将此部分添加到Web。所有对路由/{*pathInfo}的请求都将由指定的处理程序处理,即使在pathInfo中有点。(取自ServiceStack MVC主机Web。配置示例和这个答案https://stackoverflow.com/a/12151501/801189)

这应该适用于iis6和iis7。你可以通过修改'add'元素中的path="*"为'route'后面的不同路径分配特定的处理程序

  <location path="route">
    <system.web>
      <httpHandlers>
        <add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" />
      </httpHandlers>
    </system.web>
    <!-- Required for IIS 7.0 -->
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
      <validation validateIntegratedModeConfiguration="false" />
      <handlers>
        <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" />
      </handlers>
    </system.webServer>
  </location>

此外,(相关的)检查处理程序映射的顺序。我们在.ashx后面的路径中有一个.svc(例如/foo.asmx/bar.svc/path)。.svc映射首先是。svc路径,因此在。asmx之前匹配的。svc路径是404。 没有想太多,但也许url编码的路径会照顾到这一点。