运行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);
}
}
}
你应该得到HTTP 200
现在尝试用去那里 ''在路径
你应该得到一个HTTP 404错误。 (请注意,此错误通过Visual Studio调试器中运行时,不reproduceable。我们必须将代码部署到IIS)
UPDATE
我修改正则表达式来route为email地址,它使问题更糟。
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。
这是我希望避免做的事情。 – 2011-03-21 17:14:54
@ColinDesmond:我不确定你要去哪里“限制http”位。 HTTP在'.'中没有问题,它们通常用于URL和URI(以及Internet可路由的域名需要它们)。也许你的意思是RegEx或Web服务器在路由规则中解析'.'? – Powerlord 2011-03-21 18:30:14
@Colin Desmond - 我确信这个问题与IIS6有关。由于BuildStarted无法重现IIS7上的问题,而且事实上这件事在Visual Studio调试器中可以正常工作。我用你的想法来取代'。'字符与'!'。它可以很好地解决问题,直到像@Haacked这样的人确认问题。 – 2011-03-21 19:08:27