É comum simplesmente trocar o alfabeto para uso em urls, de forma que nenhuma codificação% seja necessária; apenas 3 dos 65 caracteres são problemáticos - +, /e =. as substituições mais comuns estão -no lugar de +e _no lugar de /. Quanto ao preenchimento: basta retirá-lo (o =); você pode inferir a quantidade de preenchimento necessária. Na outra ponta: basta inverter o processo:
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes)
.TrimEnd(padding).Replace('+', '-').Replace('/', '_');
com:
static readonly char[] padding = { '=' };
e para reverter:
string incoming = returnValue
.Replace('_', '/').Replace('-', '+');
switch(returnValue.Length % 4) {
case 2: incoming += "=="; break;
case 3: incoming += "="; break;
}
byte[] bytes = Convert.FromBase64String(incoming);
string originalText = Encoding.ASCII.GetString(bytes);
A questão interessante, entretanto, é: esta é a mesma abordagem que a "biblioteca de codecs comuns" usa? Certamente seria uma primeira coisa razoável a testar - esta é uma abordagem bastante comum.
Url.Encodena cordaBASE64?