Asp.net mvc 3 .NET MVC路由w/Url编码问题

Asp.net mvc 3 .NET MVC路由w/Url编码问题,asp.net-mvc-3,routing,url-encoding,Asp.net Mvc 3,Routing,Url Encoding,我有以下路由代码: routes.MapRoute( "email-validated/{sessionId}", "email-validated/{sessionId}", new { controller = "User", action = "EmailValidated", sessionId = UrlParameter.Optional } ); 当我点击带有url编码的内容的路由时,

我有以下路由代码:

routes.MapRoute(
            "email-validated/{sessionId}",
            "email-validated/{sessionId}",
            new { controller = "User", action = "EmailValidated", sessionId = UrlParameter.Optional }
            );
当我点击带有url编码的内容的路由时,它将与%2f、%2b和其他一些转义字符的路由不匹配。例如,它也不会匹配非url编码的东西(w/+等)

这项工作:

已验证电子邮件/XQiKC6KMM%2cmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso

这不起作用(包含%2f等):

这不起作用(包含+等)


看起来路由路径奇怪地处理转义的/、和+。尝试将其作为查询字符串参数传入

使您的端点:

routes.MapRoute(
            "email-validated",
            "email-validated",
            new { controller = "User", action = "EmailValidated" }
            );
用如下请求调用它:

email-validated/?sessionId=XQiKC6KMM%2fmko4nOvzGRwPu9oaZFoCtXsFFJg3ZTf9S5rsBbLGjnz3FN3SJ0apEZcqK1PIcCY28mRMykB39XnFLKaL7390CDfLZiV77cso
然后将函数从

EmailValidatedFunction(string sessionId)
{
   //...do stuff with sessionId here
}
致:


如果可以,您需要确保sessionId URL的安全性。sessionId是Base64编码的,Base64中有三个URL问题字符,“/”、“+”和“=”。创建链接时,请使用以下代码对sessionId进行编码:

    public string ToUrlSafeBase64String(string Base64String)
    {
        // avoid any slashes, plus signs or equal signs
        // the following makes this base64 string url safe
        Base64String = Base64String.Replace("/", "_");
        Base64String = Base64String.Replace("+", "-");
        return Base64String.Replace("=", String.Empty);
    }
然后,使用以下命令重新创建原始的Base64编码字符串:

    public string FromUrlSafeBase64String(string Base64String)
    {
        // add back any slashes, plus signs or equal signs
        // the following makes this url safe string a base64 string
        Base64String = Base64String.Replace("_", "/");
        Base64String = Base64String.Replace( "-", "+");
        return Base64String.PadRight(Base64String.Length + (4 - Base64String.Length % 4) % 4, '=');
    }

我找到了一个解决方案,可以在Asp.Net MVC url中使用url编码字符,如正斜杠
%2f

将以下内容添加到您的
Global.asax
文件的
应用程序\u BeginRequest
方法中:

var realUrl = Request.ServerVariables["HTTP_URL"];
Context.RewritePath(realUrl);
因为这发生在MVC路由之前,所以您将能够做您最初想要做的事情


请记住,您需要手动解码操作方法中的参数以获取其实际值(因为我们阻止框架这样做)。

您可以使用System.Web.HttpServerUtility.UrlTokenEncode(from)

您是如何生成此SessionId的?您应该使用GUID而不是该字符串。它看起来非常随机,不仅可能包含编码错误的字符,而且可能包含使请求无效的字符。会话是一个随机字符串,然后进行base 64编码,然后进行HttpUtilty.UrlEncoded。我正在将一个遗留站点移植到mvc 3,不幸的是,重新编码会话ID的工作方式非常困难,因此需要一个解决方案:(我认为这是两者中更好的解决方案。另一个答案是,如果你的车发出奇怪的噪音,让它安静下来,停止驾驶。这个答案是打开发动机罩,修理X。谢谢,这正是我需要的!
    public string ToUrlSafeBase64String(string Base64String)
    {
        // avoid any slashes, plus signs or equal signs
        // the following makes this base64 string url safe
        Base64String = Base64String.Replace("/", "_");
        Base64String = Base64String.Replace("+", "-");
        return Base64String.Replace("=", String.Empty);
    }
    public string FromUrlSafeBase64String(string Base64String)
    {
        // add back any slashes, plus signs or equal signs
        // the following makes this url safe string a base64 string
        Base64String = Base64String.Replace("_", "/");
        Base64String = Base64String.Replace( "-", "+");
        return Base64String.PadRight(Base64String.Length + (4 - Base64String.Length % 4) % 4, '=');
    }
var realUrl = Request.ServerVariables["HTTP_URL"];
Context.RewritePath(realUrl);