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上发表了一篇关于允许“顽皮的事情”的文章。