2014-09-04 14 views
10

Nowość w środowisku ASP.NET MVC. Tworzę aplikację internetową przy użyciu kreatora Visual Studio 2013. Tworzy kilka folderów, z których serwowane są pliki statyczne: Content, Scripts itdPodkatalog projektu jako katalog główny dla plików statycznych

szkieletowe w innych językach (np TurboGears) mają wyraźny ODP tylko dla zawartości statycznej, co eliminuje ryzyko obsługujących kodu źródłowego strony zamiast przetwarzania, co jest typową błędną konfiguracją witryn PHP.

Program ASP.NET z przyjemnością dostarcza wszystko w katalogu głównym aplikacji, np. http://localhost:1740/Project_Readme.html, o ile ma właściwe rozszerzenie. Tylko folder Views jest chroniony za pomocą Web.config.

Jak skonfigurować aplikację, aby używała innego katalogu niż katalog główny projektu dla plików statycznych. Na przykład. Jeśli plik favicon.ico zostanie umieszczony w podkatalogu Content, powinien być dostępny jako http://localhost:1740/favicon.ico, ale nie będzie znajdował się poza katalogiem Content, chyba że zostanie zwrócony przez kontroler.

Nic nie powinno być nigdy wykonywane w tym katalogu, to znaczy jeśli pliki * .cshtml są umieszczane w tym katalogu, zawartość plików (kod źródłowy) powinna być dostarczona jako text/plain.

Ostateczna aplikacja zostanie uruchomiona przy użyciu mod_mono w systemie Linux.

+0

To może ci pomóc: https://prerakkaushik.wordpress.com/2014/02/12/routing-request-for-static-files-with-or-without-extension-in-asp-net- mvc/ – Proggear

+0

Niestety to rozwiązanie działa tylko wtedy, gdy żądanie zaczyna się od Public, potrzebuję wszystkiego poza pojedynczym punktem końcowym. –

Odpowiedz

3

Najlepszym rozwiązaniem znalazłem jest ignorowanie asp.net normalny sposób i napisać nowy sposób

 public override void Init() 
     { 
      BeginRequest -= OnBeginRequest; 
      BeginRequest += OnBeginRequest; 
     } 


     protected void OnBeginRequest(object sender, EventArgs e) 
     { 
      if (Request.Url.AbsolutePath.StartsWith("/endPoint")) 
      { 
       Context.RemapHandler(endPoint); 
      } 
      else 
      { 
       Context.RemapHandler(staticHandler); 
      } 
     } 

Niech Endpoint i staticHandler wdrożyć IHttpHandler to działa, ale co statyczne przenosi plik do C#, więc nie może być rozwiązanie z lepszej wydajności

+0

Dzięki za rozpatrzenie tego. Spróbuję tego, gdy ponownie zrobię coś z ASP.NET. – Meinersbur

+0

To złe rozwiązanie dla wydajności, mam nadzieję, że ktoś może mi pokazać lepszy –

6

Aktualizacja:

Ben,

proponowane rozwiązanie wor ks tylko z Owinem. Aby uruchomić go w aplikacji MVC, musisz używać asp.net MVC 6 (część asp.net core lub asp.net 5). Ale dzięki Web API możesz również używać starszych wersji. Aby skonfigurować aplikację należy korzystać z następujących czynności:

  1. utworzyć pusty projekt używając szablonów wizualnych studio (nie wybrać Web API lub MVC)

  2. Dodaj następujące pakiety Nuget do projektu:

    Microsoft.AspNet.WebApi

    Microsoft.AspNet.WebApi.Owin

    Microsoft.Owin.Host.SystemWeb

    Microsoft.Owin.StaticFiles

  3. Dodaj Startup.Plik CS i dekoracji nazw z następującym

[montaż: OwinStartup (typeof (uruchamianie))]

  1. Dodaje się kod na Stratup.cs Klasa

    public void Configuration(IAppBuilder app) 
    { 
        var config = new HttpConfiguration(); 
        config.MapHttpAttributeRoutes(); 
        config.Routes.MapHttpRoute(
         name: "DefaultApi", 
         routeTemplate: "api/{controller}/{id}", 
         defaults: new {id = RouteParameter.Optional} 
         ); 
        //Configure the file/ static file serving middleware 
        var physicalFileSystem = new PhysicalFileSystem(@".\client"); 
        var fileServerOptions = new FileServerOptions 
        { 
         EnableDefaultFiles = true, 
         RequestPath = PathString.Empty, 
         FileSystem = physicalFileSystem 
        }; 
    
        fileServerOptions.DefaultFilesOptions.DefaultFileNames = new[] {"index.html"}; 
        fileServerOptions.StaticFileOptions.ServeUnknownFileTypes = true; 
        fileServerOptions.StaticFileOptions.FileSystem = physicalFileSystem; 
        app.UseFileServer(fileServerOptions); 
        app.UseWebApi(config); 
    } 
    
    1. ten powinien zrobić magię. Teraz możesz hostować aplikację w IIS. Usługi IIS będą wyświetlać zasoby statyczne tylko z folderu klienta. Dodaj folder serwera i dodaj kontrolery.

Microsoft.Owin.Host.SystemWeb co ułatwia hosting aplikacji Owin w IIS. Opcje udostępniania pliku pomagają IIS wyświetlać pliki statyczne tylko z folderu klienta.

Proszę dać mi znać, jeśli masz jakiekolwiek pytania.


Na podstawie pytania struktura projektu, którą chcesz osiągnąć, powinna wyglądać następująco.

Project Structure

Zasadniczo masz dwa foldery tylko, klient i serwer. Pliki statyczne są obsługiwane tylko z folderu klienta. Folder serwera jest niedostępny. Jeśli tego właśnie potrzebujesz, można to łatwo osiągnąć dzięki Owin Self Host z oprogramowaniem pośredniczącym do obsługi plików statycznych.

Własny host działa bez zależności od IIS. Ale jeśli planujesz hostować tę aplikację na Linuksie, możesz użyć Asp.NET CORE 1.0. Później, jeśli zdecydujesz się na hostowanie aplikacji w IIS w oknach, które można łatwo osiągnąć, dodaj pakiet nuget Microsot.Owin.Host.SystemWeb.

Istnieje wiele blogów na ten temat. To jest link dla jednego z nich. Oto link dla osiągnięcia tego samego w Asp.NET Core.

Mam nadzieję, że to rozwiązuje Twoje problemy i daj mi znać, jeśli masz jakiekolwiek pytania.

Dziękuję, Soma.

+0

Dobrze zrozumiałeś pytanie, ale nie rozumiem, jak to zrobić, jestem w systemie Windows. ze swojego linku otrzymałem var config = new HttpConfiguration(); config.Routes.MapHttpRoute ( nazwa: "DefaultApi", routeTemplate: "api/{controller}/{id}", domyślnie: nowy {id = RouteParameter.Optional} ); app.UseWebApi (config); aplikacja. UseFileServer (true); Gdzie ustawić ścieżkę do pliku i ścieżkę serwera? Jak mogę powiedzieć, z czego należy korzystać, skąd? Czy jest bardziej skuteczny niż kod? z dodaną warstwą Owin –

+0

Proszę zobaczyć aktualizację mojej odpowiedzi. Dziękuję -Soma –

+0

Cześć dziękuję za nagrodę. Jeśli to rozwiązanie odpowie na twoje pytanie, zaznacz moją odpowiedź jako zaakceptowaną. Dziękuję Ci. –

Powiązane problemy