我的这个网址在我的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)
但如果我用查询字符串更改我的网址就可以了。
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页面而不是我自己的一个自定义页面。 答案 0 :(得分:9)
尝试在网址中对网址中的电子邮件地址进行网址编码。
修改强>
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);
}
在您看来:
<a href="@Url.Action("MyAction", new { Id = email.ToBase64() })">Link</a>
在您的控制器中
function ActionResult MyAction(string id){
id = id.FromBase64();
//rest of your logic here
}
答案 1 :(得分:4)
email@domain.com
包含不属于路径合法部分的字符(出于好的理由,它们通常保留用于特殊功能)。你需要引用/ url编码这些字符或在查询字符串中传递它们。
Scott Hanselman在网址上允许“顽皮的事情”great post。