Обработчик маршрута на деле или комбинация методов обработки запросов Web Forms и MVC в приложении ASP.NET

В данной статье я покажу как можно использовать два подхода для обработки запроса в одном приложении ASP.NET. Для демонстрации воспользуемся готовым проектом, который был создан и описан в данной статье. Скачиваем проект, распаковываем его и открываем в Visual Studio. При помощи менеджера пакетов NuGet устанавливаем сборки MVC 4.
 

Копируем некоторые разделы конфигурации корневого файла Web.config приложения MVC 4   в корневой файл Web.config, нашего приложения Web Forms 4.5. Первая секция, находящаяся в элементе <system.web>
<pages>
  <namespaces>      
    <add namespace="System.Web.Helpers" />      
	<add namespace="System.Web.Mvc" />      
	<add namespace="System.Web.Mvc.Ajax" />      
	<add namespace="System.Web.Mvc.Html" />      
	<add namespace="System.Web.Routing" />      
	<add namespace="System.Web.WebPages" />      
  </namespaces>      
</pages>
и вторая
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
котрорая находится в элементе <configuration>.  Создаём каталоги Views, Home



и копируем туда полностью файл Web.config из проекта MVC 4. Поскольку студия не даёт возможности вставки страницы Razor, делаем это вручную. Открываем папку Home в проводнике Windows, создаём пустой файл с раширением cshtml и именем Index. Добавляем его к проекту как существующий файл и вставляем туда следующее содержимое.
<!DOCTYPE html>
<html lang="en">
<head>
  <title>@ViewBag.Title</title>
</head>
<body>
  <ul>
    <li>@Html.ActionLink("MVC", "Index", "Home")</li>
    <li><a href="WebForm/1" >Web Form</a></li>
  </ul>
</body>
</html>
Создаём папку Controllers и помещаем туда простой класс.
using System.Web.Mvc;

namespace TestWebApi.Controllers
{
  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      ViewBag.Title = "Обработка запроса с помощью MVС.";
      return View();
    }
  }
}
Прописываем соответствующие маршруты в файл Global.asax
namespace TestWebApi
{
  public class Global : System.Web.HttpApplication
  {
    protected void Application_Start(object sender, EventArgs e)
    {
      RegisterRoutes(RouteTable.Routes);
    }
    public static void RegisterRoutes(RouteCollection routes)
    {
      routes.MapPageRoute("DefaultForm", "WebForm/{id}", "~/WebForm.aspx");

      routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}",
        defaults: new { id = System.Web.Http.RouteParameter.Optional });

      routes.MapRoute(name: "DefaultMvc", url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", 
            action = "Index", id = UrlParameter.Optional });
    }
  }
}
Приложение готово, компилируем и запускаем его. Переходим по ссылкам и видим, что всё работает. Т.е. используя маршрутизацию и обработчики Web Forms, MVC и Web API (хотя последня это тоже шаблон MVC) мы объединили методы обработки запросов в одном приложении. Есть конечно некоторые подводные камни с разделением некоторых внутренних объектов приложения, но об этом в другой раз.



Целью данной статьи была демонстрация того, что было написано тут и тут. Особенно это полезно, для многих разработчиков, которые вроде бы имеют достаточный опыт, но смутно представляют с чем имеют дело и удивляются подобным вещам. Платформа ASP.NET - одна. Web Forms и MVC - просто разные подходы обработки запросов, которые начинаются с обработчика маршрута и обработчика HTTP-данных. Есть платформа, есть несколько подходов, значит есть возможность выбора, что всегда хорошо. Сравнивать и разводить холивары, на счёт того, что лучше не имеет смысла. Каждый инструмент имеет свои достатки и недостатки в зависимости от поставленной задачи, но в умелых руках, иначе все его преимущества сведутся на нет. А вот и ссылка на готовый проект.