MVC 3不允许'。'在使用IIS6时的URL路径中

时间:2011-03-21 15:43:26

标签: asp.net-mvc-3

运行IIS6
那么,'。'不能在IIS6中工作,但它们在visual studio调试器和IIS7中工作正常。这是重现的步骤。

重现步骤:
  - 从一个空白的MVC 3项目开始   - 添加一个名为“索引”的新视图并接受默认值   - 配置RegisterRoutes()如下:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "QuerySomething",
        "QueryStuff/Index/{*aString}",
        new { controller = "QueryStuff", action = "Index", aString = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

}

现在,添加一个返回Json的控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

    namespace MvcApplication1.Controllers
    {
        public class QueryStuffController : Controller
        {
            //
            // GET: /QueryStuff/

            public ActionResult Index(string aString)
            {
                return Json("aString:oye",JsonRequestBehavior.AllowGet);
            }

        }
    }
  1. 验证页面是否可访问:

    http://serverName/QueryStuff/Index/someInfo

  2. 你应该得到http 200。

    1. 现在尝试用'。'到达那里。在路径

      http://serverName/QueryStuff/Index/someInfo.com

    2. 您应该收到http 404错误。 (请注意,在通过visual studio调试器运行时,此错误不可重现。必须将代码部署到IIS。)

      更新
      我为route地址修改了正则表达式email,这使问题更严重。

          routes.MapRoute(
              "QuerySomething",
              "QueryStuff/Index/{aString}"
              , new { controller = "QuerySomething", action = "Index" },
              new { aString = @"\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b" }
              ); 
      

      每次都是404。

2 个答案:

答案 0 :(得分:4)

我不认为这是一个MVC错误,更多的是http的限制?我们遇到了同样的问题,最终交换了“。”为“!”在URL中然后将它们转换回“。”在控制器中。

答案 1 :(得分:1)

routes.MapRoute(
    "QuerySomething",
    "QueryStuff/Index/{*aString}",
    new { controller = "QueryStuff", action = "Index", aString = UrlParameter.Optional } // Parameter defaults
);

您忘记了路线中的通配符。 (注意上面的aString)但是,使用它们时需要注意的一点是它也匹配http://serverName/QueryStuff/Index/something.com/blah/blah/blah/blah点是文件扩展名分隔符,这就是它不包括在内的原因。如果你知道你总是有扩展名,你也可以这样做:

routes.MapRoute(
    "QuerySomething",
    "QueryStuff/Index/{aString}.{extension}",
    new { controller = "QueryStuff", action = "Index", aString = UrlParameter.Optional } // Parameter defaults
);