2017-02-24 9 views
11

テクノロジー:Visual Studioの単一ページアプリケーション統合

  • のVisual Studio 2017
  • Asp.Netコアツーリング1.1
  • の.NET Framework 4.6.2

単一ページのアプリケーションの統合とそのVisual Studioに組み込まれているすべての新しいサポートがVisual Studioに組み込まれています。あなたが通過し、さらには分析した後

  • Microsoft.AspNetCore.SpaServices
  • Microsoft.AspNetCore.NodeServices

:しかし、以前の週で、ジェフリーT.フリッツは、統合と、次のパッケージに実装する上で本当に素晴らしい記事をリリースいくつかのテンプレートを使用すると、Solution ExplorerにClientAppというディレクトリがあります。これは設定され、Webpack経由でルーティングされます。

Startup.csの中に問題が明らかになります。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions 
      { 
       HotModuleReplacement = true 
      }); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 

     app.UseStaticFiles(); 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 

      routes.MapSpaFallbackRoute(
       name: "spa-fallback", 
       defaults: new { controller = "Home", action = "Index" }); 
     }); 
    } 

私たちのリクエストでは、MVCフレームワークへのルーティングがあります。

質問、なぜこのルートを指定する必要がありますか?app.UseDefaultFiles()app.UseStaticFiles()を単純に使用し、wwwrootでインデックスを指定している場合は、私たちのクライアント側ルータは常に返されます。では、なぜ我々はそれをこのように行いません。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions 
      { 
       HotModuleReplacement = true 
      }); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 

     app.UseDefaultFiles(); 
     app.UseStaticFiles(); 
    } 

を私が直接私たちのwwwrootの内のアイテムが圧縮されていないこと、またセキュリティを漏らすことができますが、さておき、これら2つの欠点から、なぜあなたのインデックスを確保するために、このルートを使用しないで理解クライアントサイドルータが返されるとは限りません。

私は、具体的には、常にHome/IndexまたはUseDefaultFiles()/UseStaticFiles()を返すようにMVCを強制する概念について尋ねています。私は何が不足していますか、なぜMVCにそれを返すように指示されていますか?

重要:基本的には、インデックスが強制的に返され、クライアント側のフレームワークのルータが変更を処理し、バックエンドが特定のビュー状態を返すようにする方法です。

+0

彼の最初の名前は「ジェフリー」であるとの記事がで次のとおりです。https:/ /blogs.msdn.microsoft.com/webdev/2017/02/14/building-single-page-applications-on-asp-net-core-with-javascriptservices/ –

答えて

3

にそれが必要になります私たちが以前に見たことのあるもののように見えます。コメントを1として

// allow returning of physical files on the file system of the web root and it's sub dirs 
    app.UseDefaultFiles(); 
    app.UseStaticFiles(); 

    // map MVC routes to controller actions when a static file cannot be found 
    app.UseMvc(routes => 
    { 
     // default routing convention for mapping "most situations" 
     routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 

     // fallback routing 
     routes.MapSpaFallbackRoute(
      name: "spa-fallback", 
      defaults: new { controller = "Home", action = "Index" }); 
    }); 

...

静的ファイルが存在してはならない、それは本当にフォールバックです。それ はwwwrootにあるindex.htmを含まない場合は、特定のヘッダ情報が渡されない限り、しかし、それは技術的には決して そのルートを実行します

+0

私はあなたの答えが好きなので、本質的に静的なファイルが存在しなければそれは本当にフォールバックです。しかし、* wwwroot *に 'index.htm'が含まれていると、特定のヘッダー情報が渡されない限り、そのルートを決して実行しません。あなたもそれを反映するように修正できますか? – Greg

+0

ありがとうございます。 – War

+0

ありがとうございます。悲しいことに、あなたの下の答えはそれに多くの誤情報を持っています。 – Greg

4

これらのSPAテンプレートはすべて、最小限のASP.NETコアMVCサーバー基盤を使用します。 Index.cshtmlからhtmlマークアップを生成するためのMVCのデフォルトルートが必要です。

テンプレートのwwwroot/distフォルダにプレーンhtmlファイルが生成されていません。だからapp.UserDefaultFiles()にはIndex.htmlがありません。

マルチページSPAアプリケーション(oxy-moron)にもっとコントローラ/アクション/ビューを組み込むことを決めた場合は、mvcルートがあるかもしれないと推測できます。またはバックエンドwep apiで始める...?

私はMapSpaFallbackRouteに精通していませんが、SPAでカバーされていない特定のルートのキャッチオールまたはキャッチオールとして機能します。ソースコードを参照してください: https://github.com/aspnet/JavaScriptServices/blob/dev/src/Microsoft.AspNetCore.SpaServices/Routing/SpaRouteExtensions.cs

ただ、全体的なことが静的なファイルのみ、我々は、サーバーレスにしたい場合はことを言及せ、サーブ - それを-から-CDN-するスターターテンプレートと角度がありますブートへのCLI:

https://github.com/AngularClass/angular2-webpack-starter

https://github.com/angular/angular2-seed

https://cli.angular.io/

しかし、これらの静的/ MVCレスJavascriptのアプリがホスティングされている場合IISでは最小限のルーティング設定でweb.configが必要になります。参照:

https://github.com/angular/angular/issues/11046

EDIT:

もう一つの理由は、多くの人々がこれらのプロジェクトのWeb APIを利用されることであるかもしれないし、そのために、我々はまだapp.UseMvc();

+0

静的なインデックスを格納するか、デフォルトのそれを検索して戻る。そしてドキュメンテーションによると、それは例外的に、静的で、許可された、mvcになります。ミドルウェアは、より早く検出された場合に検出して中断することができます。これは本当ですか?しかし、.netコアでIISをホストする必要はありません。 – Greg

+0

index.htmlは手動で作成され、返されます。静的ページ。 – Greg

+0

ページをリフレッシュするときに問題が発生することがあります(ディープリンクなど)。 index.htmlページに何らかのルーティングメカニズムがなければ、404エラーが発生する可能性があります。 –

関連する問題