【问题标题】:Error with dot (.) character in URLURL 中的点 (.) 字符出错
【发布时间】:2014-10-15 06:15:41
【问题描述】:

当我在 ASP.NET MVC 3 项目中单击以编辑具有此 URL 的用户时遇到问题: http://domain.com:8089/User/EditUser/username.surname?IDUser=e11a621p-df11-4687-9903-8bfc33c922cf

如果我得到另一个没有“。”的用户字符,它工作正常。

错误:

HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

我尝试了一些在这里找到的技巧,例如:

  <system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>

和:

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

以及edituser操作上的这个属性:

   [ValidateInput(false)]

但似乎没有任何效果。此站点托管在 IIS 服务器上,当它在 Windows Azure 网站上时,它按预期工作。

谢谢。

【问题讨论】:

  • 尝试用%2E转义点:http://domain.com:8089/User/EditUser/username%2Esurname?IDUser=e11a621p-df11-4687-9903-8bfc33c922cf
  • @DStanley 不过,它不是必需的
  • 参见stackoverflow.com/questions/2831142/… - 尝试在&lt;httpRuntime&gt; 上设置requestPathInvalidCharacters 值。在这里,我们使用"" - 但请注意:您需要小心一点;我似乎记得为我们工作(并继续工作)很尴尬,虽然
  • @MarcGravell 也许不是(只是猜测),但它可能会阻止运行时尝试将其解释为文件扩展名或其他含义。
  • @DStanley 可以,不过 - for example here,这是 IIS 中的 MVC。

标签: c# asp.net .net asp.net-mvc url


【解决方案1】:

如果您知道编辑页面是您使用firstname.lastname url 部分的唯一页面,则可以使用此 SO 答案中描述的方法:

Prevent static file handler from intercepting filename-like URL

具体来说,在您的情况下,添加以下 web.config 部分应将请求路由到 MVC:

<system.webServer>
  ...
  <handlers>
  ...
    <add 
      name="userEditPage" 
      path="User/EditUser/*" 
      verb="GET" 
      type="System.Web.Handlers.TransferRequestHandler" 
      preCondition="integratedMode,runtimeVersionv4.0" />

如果您在User/EditUser/... 路径之外的url 中使用firstname.lastname,这将是不够的,并且不是通用解决方案。那会复杂得多,因为您需要告诉 IIS 类似以下内容:

1) 如果文件存在,则提供它(这样您的 .js 文件仍然可以正常提供)

2) 在为文件扩展名执行任何其他处理程序之前,运行 MVC 处理程序并查看是否有与 url 匹配的路由。因为如果您有一个姓氏为 html 的用户怎么办?

3) 如果 MVC 处理程序不匹配 url 的任何路由,则让其他处理程序。因为如果您的项目中还有一个.aspx 页面怎么办?

最后,对于一般情况,您可能需要考虑以下极端情况:有人恶意创建名../../web 和姓config 的用户?只是一个想法,但似乎您可以期望的最好的方法是将 URL 中 . 的使用限制为特定路径。

【讨论】:

  • 感谢您的回复,我还有一个问题,如果我将具有相同 web.config 的相同网站部署到 windows azure 网站它可以正常工作,您知道为什么吗?
  • 不知道,但很明显它与文件扩展名映射有关。也许有资源可以详细介绍 Azure 的默认处理程序映射?
【解决方案2】:

在头疼之后,我再次将它发布到Azure WebSites,它可以正常工作,使用我在本地环境中使用的相同 web.config 文件。所以解决方案必须在IIS上,然后在没有更多尝试之后,我将Application Pool更改为Default App Pool,你猜怎么着,它起作用了。

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2014-07-19
    • 1970-01-01
    • 2018-02-25
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多