我有一个项目,要求我的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中有圆点?


当前回答

对于那些只在一个网页上有这个的人来说,超级简单的答案。编辑actionlink并在它的末尾加上+“/”。

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |

其他回答

我通过编辑我的站点的HTTP处理程序得到了这个工作。对于我的需要,这很好地解决了我的问题。

我只是添加了一个新的HTTP处理程序,用于查找特定的路径条件。如果请求匹配,则正确地将其发送到. net进行处理。我更喜欢这个解决方案,URLRewrite黑客或启用RAMMFAR。

例如,要让. net处理URL www.example.com/people/michael.phelps,请在站点的web中添加以下行。系统内配置。webServer / handlers元素:

<add name="ApiURIs-ISAPI-Integrated-4.0"
     path="/people/*"
     verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

Edit

还有其他帖子建议这个问题的解决方案是RAMMFAR或RunAllManagedModulesForAllRequests。启用此选项将为所有请求启用所有托管模块。这意味着静态文件,如图像、pdf文件和其他任何文件将在不需要时由. net处理。除非你有特定的情况,否则最好不要使用这个选项。

是否可以更改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

我相信你必须在你的web.config中设置弛豫urltofilesystemmapping属性。不久前,Haack写了一篇关于这个问题的文章(还有其他一些SO帖子也问了同样类型的问题)

<system.web>
<httpRuntime relaxedUrlToFileSystemMapping="true" />

编辑 从下面的评论中可以看出,. net / IIS的后续版本可能需要在系统中安装这个。网络服务器的元素。

<system.webServer>
<httpRuntime relaxedUrlToFileSystemMapping="true" />
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplication1.Controllers
{
    [RoutePrefix("File")]
    [Route("{action=index}")]
    public class FileController : Controller
    {
        // GET: File
        public ActionResult Index()
        {
            return View();
        }

        [AllowAnonymous]
        [Route("Image/{extension?}/{filename}")]
        public ActionResult Image(string extension, string filename)
        {
            var dir = Server.MapPath("/app_data/images");

            var path = Path.Combine(dir, filename+"."+ (extension!=null?    extension:"jpg"));
           // var extension = filename.Substring(0,filename.LastIndexOf("."));

            return base.File(path, "image/jpeg");
        }
    }
}

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

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

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