MVC4:使用电子邮件作为参数进行URL路由

我有这个url在我的VS网络服务器上运行得非常好

http://localhost:4454/cms/account/edituser/email@domain.com (works) 

但是当我将这个站点发布到IIS7.5时,它只会抛出404。

 http://dev.test.com/cms/account/edituser/email@domian.com (does not work) 

但如果删除电子邮件地址,就会发生奇怪的事情

 http://dev.test.com/cms/account/edituser/email (works , no 404) 

但如果我用查询字符串更改我的url,它可以正常工作

 http://dev.test.com/cms/account/edituser?id=email@domain.com (works) 

这是我的路线入口

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

我注意到的奇怪的事情是,当服务器抛出404错误页面时,它是标准iis 404页面而不是我拥有的一个自定义页面。
所以我想知道我的路由映射有什么问题,或者IIS不喜欢有电子邮件作为参数的url。 但是我的当地开发人员一切正常。
谢谢

尝试在URL中编码电子邮件地址的URL。

编辑

UrlEncode + Base64?

  public static string ToBase64(this string value) { byte[] bytes = Encoding.UTF8.GetBytes(value); return Convert.ToBase64String(bytes); } public static string FromBase64(this string value) { byte[] bytes = Convert.FromBase64String(value); return Encoding.UTF8.GetString(bytes); } 

在你看来:

 Link 

在你的控制器中

 function ActionResult MyAction(string id){ id = id.FromBase64(); //rest of your logic here } 

email@domain.com包含不是路径合法部分的字符(有充分理由,它们通常用于特殊function)。 你需要引用/ url编码这些字符或在查询字符串中传递它们。

斯科特·汉塞尔曼(Scott Hanselman)在url上发表了一篇关于允许“顽皮的事情”的文章。