2011-03-21 30 views
2

运行IIS6
所以,'。'不在IIS6中工作,但它们在Visual Studio调试器和IIS7中正常工作。以下是重现的步骤。MVC 3不允许'。'在URL路径中使用IIS6时

重现步骤:
- 从一个空白的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

你应该得到HTTP 200

  1. 现在尝试用去那里 ''在路径

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

你应该得到一个HTTP 404错误。 (请注意,此错误通过Visual Studio调试器中运行时,不reproduceable。我们必须将代码部署到IIS)

UPDATE
我修改正则表达式来routeemail地址,它使问题更糟。

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

有了这个它每次404。

回答

4

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

+1

这是我希望避免做的事情。 – 2011-03-21 17:14:54

+1

@ColinDesmond:我不确定你要去哪里“限制http”位。 HTTP在'.'中没有问题,它们通常用于URL和URI(以及Internet可路由的域名需要它们)。也许你的意思是RegEx或Web服务器在路由规则中解析'.'? – Powerlord 2011-03-21 18:30:14

+1

@Colin Desmond - 我确信这个问题与IIS6有关。由于BuildStarted无法重现IIS7上的问题,而且事实上这件事在Visual Studio调试器中可以正常工作。我用你的想法来取代'。'字符与'!'。它可以很好地解决问题,直到像@Haacked这样的人确认问题。 – 2011-03-21 19:08:27

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 
); 
+0

@BuildStarted - 我仍然用{* aString}得到404。还尝试了{* aString *}。没有差异。另一方面,这并不能解释为什么使用Visual Studio调试器时不会出现错误。 – 2011-03-21 17:13:59

+0

刚刚在这里测试过,它工作正常。 '{* aString *}'不起作用,它必须是'{* aString}'。我正在运行IIS7,所以这可能是一个问题呢?你在运行IIS6吗? – Buildstarted 2011-03-21 18:10:32

+0

关于调试器。它可能取决于您要发布到哪个版本的IIS。 – Buildstarted 2011-03-21 18:11:41