Używanie wzorca ASP.NET MVC z różnymi wersjami usług IIS (C#)

autor: Microsoft

Z tego samouczka dowiesz się, jak używać ASP.NET MVC i routingu adresów URL z różnymi wersjami usług Internet Information Services. Poznasz różne strategie używania ASP.NET MVC z usługami IIS 7.0 (tryb klasyczny), IIS 6.0 i starszymi wersjami usług IIS.

Struktura ASP.NET MVC zależy od ASP.NET routingu w celu kierowania żądań przeglądarki do akcji kontrolera. Aby móc korzystać z usługi ASP.NET Routing, może być konieczne wykonanie dodatkowych kroków konfiguracji na serwerze internetowym. Wszystko zależy od wersji usług Internet Information Services (IIS) i trybu przetwarzania żądań dla aplikacji.

Oto podsumowanie różnych wersji usług IIS:

  • IIS 7.0 (tryb zintegrowany) — brak specjalnej konfiguracji niezbędnej do korzystania z routingu ASP.NET.
  • IIS 7.0 (tryb klasyczny) — musisz wykonać specjalną konfigurację, aby używać routingu ASP.NET.
  • Usługi IIS 6.0 lub nowsze — należy wykonać specjalną konfigurację, aby używać routingu ASP.NET.

Najnowsza wersja usług IIS to wersja 7.5 (w systemie Win7). Usługi IIS 7 usług IIS są dołączone do systemu Windows Server 2008 I VISTA/SP1 i nowszych. Można również zainstalować usługi IIS 7.0 w dowolnej wersji systemu operacyjnego Vista z wyjątkiem Home Basic (zobacz https://technet.microsoft.com/library/cc731179%28WS.10%29.aspx).

Usługi IIS 7.0 obsługują dwa tryby przetwarzania żądań. Możesz użyć trybu zintegrowanego lub trybu klasycznego. Nie trzeba wykonywać żadnych specjalnych kroków konfiguracji podczas korzystania z usług IIS 7.0 w trybie zintegrowanym. Należy jednak wykonać dodatkową konfigurację podczas korzystania z usług IIS 7.0 w trybie klasycznym.

System Microsoft Windows Server 2003 zawiera usługi IIS 6.0. Nie można uaktualnić usług IIS 6.0 do usług IIS 7.0 w przypadku korzystania z systemu operacyjnego Windows Server 2003. Podczas korzystania z usług IIS 6.0 należy wykonać dodatkowe kroki konfiguracji.

Program Microsoft Windows XP Professional zawiera usługi IIS 5.1. Podczas korzystania z usług IIS 5.1 należy wykonać dodatkowe kroki konfiguracji.

Na koniec systemy Microsoft Windows 2000 i Microsoft Windows 2000 Professional obejmują usługi IIS 5.0. Podczas korzystania z usług IIS 5.0 należy wykonać dodatkowe kroki konfiguracji.

Zintegrowany i klasyczny

Usługi IIS 7.0 mogą przetwarzać żądania przy użyciu dwóch różnych trybów przetwarzania żądań: zintegrowanych i klasycznych. Tryb zintegrowany zapewnia lepszą wydajność i więcej funkcji. Tryb klasyczny jest uwzględniany w celu zapewnienia zgodności z poprzednimi wersjami usług IIS.

Tryb przetwarzania żądań jest określany przez pulę aplikacji. Można określić, który tryb przetwarzania jest używany przez określoną aplikację internetową, określając pulę aplikacji skojarzona z aplikacją. Wykonaj następujące kroki:

  1. Uruchamianie Internet Information Services Manager
  2. W oknie Połączenia wybierz aplikację
  3. W oknie Akcje kliknij link Ustawienia podstawowe , aby otworzyć okno dialogowe Edytowanie aplikacji (zobacz Rysunek 1)
  4. Zanotuj wybraną pulę aplikacji.

Domyślnie usługi IIS są skonfigurowane do obsługi dwóch pul aplikacji: DefaultAppPool i klasycznej puli aplikacji platformy .NET. Jeśli wybrano opcję DefaultAppPool, aplikacja jest uruchomiona w zintegrowanym trybie przetwarzania żądań. Jeśli wybrano klasyczną pulę aplikacji .NET, aplikacja jest uruchomiona w klasycznym trybie przetwarzania żądań.

Zrzut ekranu przedstawiający okno dialogowe Edytowanie aplikacji, które pokazuje, że usługi IIS są skonfigurowane do uruchamiania aplikacji w zintegrowanym trybie przetwarzania żądań.

Rysunek 1. Wykrywanie trybu przetwarzania żądań(Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Zwróć uwagę, że w oknie dialogowym Edytowanie aplikacji można zmodyfikować tryb przetwarzania żądań. Kliknij przycisk Wybierz i zmień pulę aplikacji skojarzona z aplikacją. Należy pamiętać, że podczas zmiany aplikacji ASP.NET z klasycznego na zintegrowany tryb występują problemy ze zgodnością. Aby uzyskać więcej informacji, zobacz następujące artykuły:

Jeśli aplikacja ASP.NET korzysta z puli DefaultAppPool, nie musisz wykonywać żadnych dodatkowych kroków, aby uzyskać routing ASP.NET (a w związku z tym ASP.NET MVC) do pracy. Jeśli jednak aplikacja ASP.NET jest skonfigurowana do korzystania z klasycznej puli aplikacji .NET, należy przeczytać więcej pracy.

Używanie ASP.NET MVC ze starszymi wersjami usług IIS

Jeśli musisz użyć ASP.NET MVC ze starszą wersją usług IIS niż IIS 7.0 lub musisz użyć usług IIS 7.0 w trybie klasycznym, masz dwie opcje. Najpierw można zmodyfikować tabelę tras, aby używać rozszerzeń plików. Na przykład zamiast żądać adresu URL takiego jak /Store/Details, możesz zażądać adresu URL takiego jak /Store.aspx/Details.

Drugą opcją jest utworzenie czegoś o nazwie mapa skryptu z symbolami wieloznacznymi. Mapa skryptów z symbolami wieloznacznymi umożliwia mapowania każdego żądania na platformę ASP.NET.

Jeśli nie masz dostępu do serwera internetowego (na przykład aplikacja ASP.NET MVC jest hostowana przez internet dostawcę usług), musisz użyć pierwszej opcji. Jeśli nie chcesz modyfikować wyglądu adresów URL i masz dostęp do serwera internetowego, możesz użyć drugiej opcji.

Szczegółowo omówimy każdą opcję w poniższych sekcjach.

Dodawanie rozszerzeń do tabeli tras

Najprostszym sposobem uzyskania ASP.NET routingu do pracy ze starszymi wersjami usług IIS jest zmodyfikowanie tabeli tras w pliku Global.asax. Domyślny i niezmodyfikowany plik Global.asax na liście 1 konfiguruje jedną trasę o nazwie Trasa domyślna.

Lista 1 — Global.asax (niezmodyfikowana)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    public class GlobalApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Trasa domyślna skonfigurowana na liście 1 umożliwia kierowanie adresów URL, które wyglądają następująco:

/Home/Index

/Product/Details/3

/Produktu

Niestety starsze wersje usług IIS nie będą przekazywać tych żądań do platformy ASP.NET. W związku z tym te żądania nie będą kierowane do kontrolera. Jeśli na przykład utworzysz żądanie przeglądarki dla adresu URL /Home/Index, zostanie wyświetlona strona błędu na rysunku 2.

Zrzut ekranu przedstawiający okno programu Microsoft Internet Explorer, które pokazuje błąd 404 Nie znaleziono.

Rysunek 2. Odbieranie błędu 404 Nie znaleziono(Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Starsze wersje usług IIS mapować tylko niektóre żądania na platformę ASP.NET. Żądanie musi dotyczyć adresu URL z odpowiednim rozszerzeniem pliku. Na przykład żądanie /SomePage.aspx jest mapowane na platformę ASP.NET. Jednak żądanie /SomePage.htm nie.

W związku z tym, aby ASP.NET Routing działało, musimy zmodyfikować trasę domyślną tak, aby zawierała rozszerzenie pliku mapowane na platformę ASP.NET.

Odbywa się to przy użyciu skryptu o nazwie registermvc.wsf. Został on dołączony do wersji ASP.NET MVC 1 w C:\Program Files\Microsoft ASP.NET\ASP.NET MVC\Scriptssystemie , ale od ASP.NET 2 ten skrypt został przeniesiony do ASP.NET Futures.

Wykonanie tego skryptu powoduje zarejestrowanie nowego rozszerzenia mvc za pomocą usług IIS. Po zarejestrowaniu rozszerzenia mvc można zmodyfikować trasy w pliku Global.asax, aby trasy używały rozszerzenia mvc.

Zmodyfikowany plik Global.asax na liście 2 działa ze starszymi wersjami usług IIS.

Lista 2 — Global.asax (zmodyfikowana z rozszerzeniami)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",
                "{controller}.mvc/{action}/{id}",
                new { action = "Index", id = "" }
              );

            routes.MapRoute(
              "Root",
              "",
              new { controller = "Home", action = "Index", id = "" }
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Ważne: pamiętaj, aby ponownie skompilować aplikację ASP.NET MVC po zmianie pliku Global.asax.

Istnieją dwie ważne zmiany w pliku Global.asax na liście 2. Istnieją teraz dwie trasy zdefiniowane w pliku Global.asax. Wzorzec adresu URL dla trasy domyślnej, pierwsza trasa, wygląda teraz następująco:

{controller}.mvc/{action}/{id}

Dodanie rozszerzenia mvc zmienia typ plików przechwyconych przez moduł routingu ASP.NET. Dzięki tej zmianie aplikacja ASP.NET MVC kieruje teraz żądania podobne do następujących:

/Home.mvc/Index/

/Product.mvc/Details/3

/Product.mvc/

Druga trasa, trasa główna, jest nowa. Ten wzorzec adresu URL dla trasy głównej jest pustym ciągiem. Ta trasa jest niezbędna do dopasowywania żądań względem katalogu głównego aplikacji. Na przykład trasa główna będzie zgodna z żądaniem, które wygląda następująco:

http://www.YourApplication.com/

Po wprowadzeniu tych modyfikacji do tabeli tras należy upewnić się, że wszystkie linki w aplikacji są zgodne z tymi nowymi wzorcami adresów URL. Innymi słowy, upewnij się, że wszystkie linki zawierają rozszerzenie mvc. Jeśli używasz metody pomocnika Html.ActionLink() do generowania linków, nie musisz wprowadzać żadnych zmian.

Zamiast używać skryptu registermvc.wcf, można dodać nowe rozszerzenie do usług IIS, które jest mapowane na platformę ASP.NET ręcznie. Podczas samodzielnego dodawania nowego rozszerzenia upewnij się, że pole wyboru z etykietą Sprawdź, czy plik istnieje , nie jest zaznaczone.

Serwer hostowany

Nie zawsze masz dostęp do serwera internetowego. Jeśli na przykład hostujesz aplikację ASP.NET MVC przy użyciu internetowego dostawcy hostingu, nie musisz mieć dostępu do usług IIS.

W takim przypadku należy użyć jednego z istniejących rozszerzeń plików mapowanych na platformę ASP.NET. Przykłady rozszerzeń plików mapowanych na ASP.NET obejmują rozszerzenia aspx, axd i .ashx.

Na przykład zmodyfikowany plik Global.asax na liście 3 używa rozszerzenia aspx zamiast rozszerzenia mvc.

Lista 3 — Global.asax (zmodyfikowana za pomocą rozszerzeń aspx)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",
                "{controller}.aspx/{action}/{id}",
                new { action = "Index", id = "" }
              );

            routes.MapRoute(
              "Root",
              "",
              new { controller = "Home", action = "Index", id = "" }
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Plik Global.asax na liście 3 jest dokładnie taki sam jak poprzedni plik Global.asax, z wyjątkiem faktu, że używa rozszerzenia aspx zamiast rozszerzenia mvc. Nie musisz wykonywać żadnej konfiguracji na zdalnym serwerze sieci Web, aby używać rozszerzenia aspx.

Tworzenie mapy skryptów z symbolami wieloznacznymi

Jeśli nie chcesz modyfikować adresów URL aplikacji ASP.NET MVC i masz dostęp do serwera internetowego, masz dodatkową opcję. Możesz utworzyć mapę skryptów z symbolami wieloznacznymi, która mapuje wszystkie żądania na serwer internetowy na platformę ASP.NET. W ten sposób można użyć domyślnej tabeli tras ASP.NET MVC z usługami IIS 7.0 (w trybie klasycznym) lub IIS 6.0.

Należy pamiętać, że ta opcja powoduje, że usługi IIS przechwytywać każde żądanie na serwerze sieci Web. Obejmuje to żądania dotyczące obrazów, klasycznych stron ASP i stron HTML. W związku z tym włączenie mapy skryptu z symbolami wieloznacznymi w celu ASP.NET ma wpływ na wydajność.

Oto jak włączyć mapę skryptów wieloznacznych dla usług IIS 7.0:

  1. Wybierz aplikację w oknie Połączenia
  2. Upewnij się, że wybrano widok Funkcje
  3. Kliknij dwukrotnie przycisk Mapowania programu obsługi
  4. Kliknij link Dodaj mapę skryptów wieloznacznych (zobacz Rysunek 3)
  5. Wprowadź ścieżkę do pliku aspnet_isapi.dll (tę ścieżkę można skopiować z mapy skryptu PageHandlerFactory)
  6. Wprowadź nazwę MVC
  7. Kliknij przycisk OK

Zrzut ekranu przedstawiający okno Internet Information Services Manager 7 punkt 0, w którym jest wyświetlane okno dialogowe Dodawanie mapy skryptów wieloznacznych.

Rysunek 3. Tworzenie mapy skryptów wieloznacznych za pomocą usług IIS 7.0 (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Wykonaj następujące kroki, aby utworzyć mapę skryptów z symbolami wieloznacznymi za pomocą usług IIS 6.0:

  1. Kliknij prawym przyciskiem myszy witrynę internetową i wybierz pozycję Właściwości
  2. Wybierz kartę Katalog główny
  3. Kliknij przycisk Konfiguracja
  4. Wybieranie karty Mapowania
  5. Kliknij przycisk Wstaw (zobacz Rysunek 4)
  6. Wklej ścieżkę do aspnet_isapi.dll w polu Wykonywalny (tę ścieżkę można skopiować z mapy skryptu dla plików aspx)
  7. Usuń zaznaczenie pola wyboru z etykietą Sprawdź, czy plik istnieje
  8. Kliknij przycisk OK

Zrzut ekranu przedstawiający okno Internet Information Services 6 punkt 0, w którym jest wyświetlane okno dialogowe Dodawanie mapowania rozszerzeń aplikacji edycji ukośnika.

Rysunek 4. Tworzenie mapy skryptów z symbolami wieloznacznymi za pomocą usług IIS 6.0 (Kliknij, aby wyświetlić obraz pełnowymiarowy)

Po włączeniu map skryptów z symbolami wieloznacznymi należy zmodyfikować tabelę tras w pliku Global.asax, tak aby zawierała trasę główną. W przeciwnym razie po wysłaniu żądania do strony głównej aplikacji na rysunku 5 zostanie wyświetlona strona błędu. Możesz użyć zmodyfikowanego pliku Global.asax na liście 4.

Zrzut ekranu przedstawiający okno programu Microsoft Internet Explorer, które pokazuje błąd braku trasy głównej: Żądanie przychodzące nie jest zgodne z żadną trasą.

Rysunek 5. Błąd braku trasy głównej (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Lista 4 — Global.asax (zmodyfikowana przy użyciu trasy głównej)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
 
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { action = "Index", id = "" }
              );

            routes.MapRoute(
              "Root",
              "",
              new { controller = "Home", action = "Index", id = "" }
            );

        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Po włączeniu mapy skryptów z symbolami wieloznacznymi dla usług IIS 7.0 lub IIS 6.0 można wysyłać żądania, które działają z domyślną tabelą tras, która wygląda następująco:

/

/Strona główna/Indeks

/Product/Details/3

/Produktu

Podsumowanie

Celem tego samouczka było wyjaśnienie, jak można używać ASP.NET MVC w przypadku korzystania ze starszej wersji usług IIS (lub usług IIS 7.0 w trybie klasycznym). Omówiliśmy dwie metody uzyskiwania routingu ASP.NET do pracy ze starszymi wersjami usług IIS: Modyfikowanie domyślnej tabeli tras lub tworzenie mapy skryptów z symbolami wieloznacznymi.

Pierwsza opcja wymaga zmodyfikowania adresów URL używanych w aplikacji MVC ASP.NET. Jedną z bardzo znaczących zalet tej pierwszej opcji jest to, że nie potrzebujesz dostępu do serwera internetowego w celu zmodyfikowania tabeli tras. Oznacza to, że możesz użyć tej pierwszej opcji nawet podczas hostowania aplikacji ASP.NET MVC z internetową firmą hostingową.

Drugą opcją jest utworzenie mapy skryptów z symbolami wieloznacznymi. Zaletą tej drugiej opcji jest to, że nie trzeba modyfikować adresów URL. Wadą tej drugiej opcji jest to, że może to mieć wpływ na wydajność aplikacji ASP.NET MVC.