2013-04-12 2 views
4

У меня есть этот адрес, который работает абсолютно нормально на моем веб-сервере VSMVC4: URL маршрутизации с электронной почтой в качестве параметра

http://localhost:4454/cms/account/edituser/[email protected] (works) 

но когда я публикую этот сайт IIS7.5, он просто бросает 404.

http://dev.test.com/cms/account/edituser/[email protected] (does not work) 

но странные вещи происходит, если удалить E-mail адрес

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

но если я изменить URL со строкой запроса он отлично работает

http://dev.test.com/cms/account/[email protected] (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-адрес, который имеет адрес электронной почты как параметр. но все работает отлично с моим местным разработчиком.
Thanks

ответ

7

Попробуйте ввести URL-адрес, указанный в URL-адресе.

EDIT

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 
} 
+0

Спасибо @Raciel. MVC делает кодирование самостоятельно, как электронная почта% 40domian.com – Nnp

+0

Base64 + UrlEncode должен предоставить вам то, что вам нужно. –

+0

Где добавить функции ToBase64 и FromBase64? –

4

[email protected] содержит символы, которые не являются юридической частью пути (по уважительной причине, они часто зарезервированы для специальные функции). Вам нужно будет указать/url закодировать эти символы или передать их в строке запроса.

У Скотта Ганзельмана есть great post, позволяющий «Непослушные вещи» в URL-адресах.

Смежные вопросы