Как принять параметр электронной почты в ASP.Net MVC 3 - PullRequest
1 голос
/ 17 июля 2011

Я использую ASP.Net MVC 3 и пытаюсь передать адрес электронной почты в качестве параметра в URL, например:

www.myapp.co.uk/customers/changedetails/john@doe.com

Значение параметра при передаче равно нулю. Если я использую параметры, то это работает;

www.myapp.co.uk/customers/changedetails/?email=john@doe.com

Мой контроллер выглядит так:

    public class CustomerController {

    [HttpGet]
    public ViewResult ChangeDetails(string email)
    {
      var model = GetModel(email);
       return View(model);
    }
    }

Мой регистр маршрутов выглядит так:

   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
      routes.MapRoute(
          "Default",
          "{controller}/{action}/{id}",
          new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );
   }

Что мне не хватает, чтобы использовать электронную почту в качестве параметра {id} (www.myapp.co.uk/customers/changedetails/john@doe.com)?:

Ответы [ 3 ]

6 голосов
/ 26 марта 2014

Не указывайте адрес электронной почты как последний параметр маршрута. Или, если вы это сделаете, добавьте косую черту.

/my/route/ee@mail.com -> fail
/my/route/ee@mail.com/ -> success
/my/ee@mail.com/route -> success

Рассуждать об этом довольно сложно, но вот хорошая статья об этих вещах http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx

В чем я уверен, так это то, что, если у вас электронное письмо последнее, без косой черты, запрос даже не достигнет конвейера asp.net. Это похоже на запрос файла. При этом расширение * .com выглядит действительно очень опасным. Наличие @ в имени файла, безусловно, не уменьшает его подозрительности.

Вы можете заставить это работать. Возможно, вам придется ослабить защиту, но в определенный момент она почти наверняка сломается.

Итак, лучший вариант - сохранить его в качестве параметра строки запроса. Второй лучший вариант - это косая черта.

1 голос
/ 17 июля 2011

Вам необходимо добавить другой маршрут:

      routes.MapRoute(
          "ChangeEmail",
          "customers/changedetails/{email}",
          new { controller = "Customers", action = "ChangeDetails", email = UrlParameter.Optional }
      );

Имя параметра URL должно соответствовать имени параметра метода действия.

0 голосов
/ 28 ноября 2016

Вы можете попробовать добавить следующий код в ваш файл web.config.

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

Это потому, что IIS Express считает «.com» расширением и ищет соответствующий модуль для его обработки.Тем не менее, нет связанного модуля, поэтому он вызывает статический модуль для его обработки.Затем он будет искать путь к файлу статического содержимого "/customers/changedetails/john@doe.com", а затем сообщит об ошибке 404 not found.Добавьте приведенный выше код в ваш web.config, чтобы ваш запрос содержал электронную почту, обрабатываемую модулем MVC вместо модуля StaticFile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...