ASPについてNET 5 Webアプリケーション構造

15238 ワード

本文はASP.を参照する.NET 5公式文書Understanding ASP.NET 5 Web Appsは、いくつかの個人的な理解を加えて、理解が間違っているところを指摘して、お互いに勉強してほしいと思っています.
ASP.NET 5はWEBプログラミングに対していくつかの新しい基本概念を導入し,これらの概念を理解することはWEB応用の迅速な開発にとって重要である.これらの概念はあなたにとって新しいものではないかもしれませんが、ASPを使用しています.NETとVisual Studioが従来のWEBアプリケーション開発を行うプログラマーにとって、これらの概念は新しいかもしれません.
この文書の主な内容は次のとおりです.
  • ASP.NETプロジェクト構造
  • Framework実行時
  • project.jsonファイル
  • global.jsonファイル
  • wwwrootフォルダ
  • クライアント依存管理
  • サービス側依存管理
  • アプリケーション起動
  • ASP.NETプロジェクト構造


    前のASPとNETソリューションと比較すると、ASP.NET 5にはSolution Itemsフォルダが1つ増え、globalが入っています.jsonファイルは、WEBプロジェクトがsrcフォルダに格納されます.新しい構造には特殊なフォルダがあり、このようなノードが追加されました.プロジェクトのルートディレクトリを開くと、bowerという新しいファイルがいくつか追加されました.json, appsettings.json, gulpfile.js, package.json, project.JsonとStartup.csなど.
    また、注意深い子供靴はglobalを発見します.asax, packages.config, web.configこれらのファイルはすべてなくなりました.ASP.NET以前のバージョンでは、これらのファイルには多くのアプリケーション構成情報が保存されていました.ただしASP.NET 5では、これらの情報と論理がより小さく、より集中したファイルに再構築されています.

    ランタイムターゲットフレーム


    ASP.NET 5は、従来の2つのランタイム環境で動作可能である.NET Frameworkと新しいNET Coreは、デフォルトではアプリケーションが使用する.NET Frameworkのフルバージョンが実行されます.しかし、私たちも選択することができます.NET Coreバージョン.プロジェクトで右クリック>アトリビュートを使用して、現在のプロジェクトで使用されている実行時を表示できます.
    .NETコア--はい.NET Frameworkのサブセットは、新しい、モジュール化された(NuGetを利用して)、プラットフォームにまたがるより小さな体積の実行時です.使用するNET Coreは、アプリケーションごとに独自のものを導入することができます.NETランタイム、つまり、ホストOSにインストールされているランタイムバージョンではなく、導入されたランタイムバージョンでアプリケーションが実行されます.1つのアプリケーションの実行時バージョンは、他のアプリケーションの実行時バージョンとは異なり、並列に実行できます.必要に応じてアプリケーションの実行時を更新できますが、他のアプリケーションには影響しません.これにより、アプリケーションの導入とアーキテクチャの更新がより簡単になり、システム上で実行される他のアプリケーションに影響を与えることが少なくなります.
    .NET Framework---現在.NET CoreのAPIは完璧です.NET Frameworkはまだ多くの不足があるため、多くの伝統的なアプリケーションはASP.NET 5ではフルバージョンのみ使用できます.NET Frameworkは、依存するコンポーネントやクラスライブラリがあるため実行されます.NET Coreにはまだありません.使用するNET Frameworkの既存のアプリケーションとライブラリは、変更を必要とせずに実行中に動作します.

    project.jsonファイル


    これはASPです.NET 5には、プロジェクトの基本情報、依存関係などを記述するファイルが追加されました.
    {
      "userSecretsId": "aspnet5-FeatureVote-bd1ba2ae-0e4f-4e48-8ffc-fe223c1dc3cd",
      "version": "1.0.0-*",
      "compilationOptions": {
        "emitEntryPoint": true
      },
    
      "dependencies": {
        "Microsoft.ApplicationInsights.AspNet": "1.0.0-rc1",
        "Microsoft.AspNet.Diagnostics": "1.0.0-rc1-final",
        "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
        "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
        "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
        "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
        "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
        "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
        "Microsoft.Extensions.Configuration": "1.0.0-rc1-final",
        "Microsoft.Extensions.Configuration.FileProviderExtensions" : "1.0.0-rc1-final",
        "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
        "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
        "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
        "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
        "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"
      },
    
      "commands": {
        "web": "Microsoft.AspNet.Server.Kestrel --server.urls=http://localhost:5000"
      },
    
      "frameworks": {
        "dnx461": { },
        "dnxcore50": { }
      },
    
      "exclude": [
        "wwwroot",
        "node_modules"
      ],
      "publishExclude": [
        "**.user",
        "**.vspscc"
      ],
      "scripts": {
        "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
      }
    }
     
  • userSecretsIdはアプリケーションの一意のIDであり、暗号化されたストレージデータに関連しているようで、具体的にはまだ分からない.
  • versionは、バージョン情報を記述する.
  • compilationOptionsには、emitEntryPointがコンパイラにアプリケーションかクラスライブラリかを教えるために使用されるアプリケーションのコンパイルオプションが格納されています.アプリケーションであれば、プロジェクトコードにはpublic static void Main()の方法が必要です(Startup.csのpublic static void Main(string[] args) => WebApplication.Run<Startup>(args);を参照).
  • また、著者(authors)や説明(description)など、このプロジェクトに関する他の情報を指定することもできます.
  • dependenciesは、プロジェクトの依存関係を記述しています.依存項目はNuGetパッケージであっても他のプロジェクトであってもよいし、依存項目バージョンは具体的に作成してもよいし、ワイルドカードを使用してもよいし、ikeyiを使用して大きなバージョンを指定し、小さなバージョンが更新されると自動的に最新の小さなバージョン(nodenodeのようなパッケージ)を取得します.
  • commands ASP.NET 5は、コマンドラインで実行可能なコマンド(Webサイトの起動やテストの実行など)を構成する多くのコマンドラインツールをサポートします.
  • frameworksこのセクションでは、コンパイルで使用するターゲットフレームワークと依存関係を指定します.-Excludeは、コンパイル時に除外された部分をマークするために使用されます.
  • publishExcludeは、Webサイトの公開時に除外された部分をマークするために使用されます.
  • scriptsは、自動化構築時のスクリプトを記述する.
  • global.jsonファイル


    このファイルは、ソリューションの全体的な構成情報を格納するために使用されます.デフォルトでは、projectssdkの2つの構成セクションが含まれています.
    {
      "projects": [ "src", "test" ],
      "sdk": {
        "version": "1.0.0-rc1-update1"
      }
    }
     
  • projectsは、どのフォルダにアイテムを格納するソースコード
  • を指定します.
  • sdkは、Visual Studioがソリューションを開くときに使用するDNX(.Net Execution Environment)のバージョンを指定します.ここではprojectではなく設定されています.jsonは、ソリューション内の異なるプロジェクトが異なるバージョンのSDKを使用することを避けるためです.
  • wwwrootフォルダ


    ASP.NETの初期バージョンでは、プロジェクトが存在するフォルダがWEBアプリケーションのルートディレクトリであり、url要求はhttp://xxxx/default.aspxのような具体的なファイルに対応しており、後期バージョンでは、ルーティング概念の加入によってurlと具体的なファイルが分離される.しかし、静的ファイルのロード(jsファイル、cssファイルなど)は、ディレクトリ構造に基づいています.このようなファイルベースのアクセス方式には、プロジェクトの機密ファイルがアクセスされないように保護する方法(例えば、web.config、global.asax)など、多くの問題があります.以前は、ブラックリスト方式で特定のファイルやファイルタイプがアクセスされないことを保証していましたが、この方式はホワイトリスト方式よりも安全性が低いです.ASP.NET 5はまた、一部のファイルがテスト環境と本番環境で異なるバージョンであるという問題(例えば、web.config)を解決した.ASP.NET 5のwwwrootはWEBアプリケーションの実行時のディレクトリで、appsettingsのような静的ファイルがあります.jsonは中に入れていないし、アクセスされる心配もないので、機密ファイルへのアクセスを阻止するための特別なルールを作成する必要もありません.ASP.NET 5はホワイトリスト方式を採用している.すなわち、www rootフォルダ内のファイルのみがWebリクエストでアクセスできる.wwwrootフォルダはデフォルトのWebアプリケーションが存在するフォルダで、指定したフォルダを使用する場合はproject.jsonに配置します.

    クライアント依存管理


    この依存フォルダには、2つのサブフォルダが含まれています.bowerとNPMです.これは、クライアントを取得する依存を管理する2つのパッケージマネージャです.フォルダを展開すると、各ツールが現在管理している依存項目とそのバージョンが表示されます.
    bowerとNPMの具体的な機能はネット上で多く紹介されていますが、ここでは詳しく説明しません.

    サーバ側依存管理


    プロジェクトの参照項目は、ソリューションエクスプローラの参照フォルダの下に詳細に表示されます.これは皆さんがよく知っているはずです.異なる点は、2つのターゲットフレームワークを参照していることです.完全なDNX 4.5.1とDNX Core 5.0で、各ターゲットフレームワークにはそれぞれの参照関係があり、アイコンを使用して、1つのコンポーネントがNuGetリソースパッケージであるか、または他のプロジェクトが参照されているかを区別できます.これらの依存はコンパイル時にチェックされ、失われた依存項目は構成されたNuGetパッケージソース(ツール>NuGetパッケージマネージャ>パッケージマネージャ設定>パッケージソース)からダウンロードされます.

    アプリケーションの起動


    ASP.NET 5はプログラムを様々なモジュールに分解し、これらのモジュールは必要に応じてWEBアプリケーションに個別に追加することができる.これにより、プログラムがより簡素化されます.空のテンプレートを使用してASPを作成する場合はNET 5アプリケーションではStartupが見つかりますcsファイルには簡単な数行のコードしかありません.デフォルトのWEBプロジェクトではstartupクラスがconfiguration,MVC,EF,Identity services,logging,routesなどのプロセッサを接続する.ASPをどのように構成するかを示す良い例を提供します.NETアプリ.startupクラスのサンプルには、構造関数、ConfigureServicesおよびConfigure ConfigureメソッドがConfigureServicesメソッドの後に呼び出され、中間部品を構成するために使用される3つの部分が含まれている.
    public Startup(IHostingEnvironment env)
    {
        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
    
        if (env.IsDevelopment())
        {
            // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
            builder.AddUserSecrets();
        }
    
        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }
     
    コンストラクション関数では、アプリケーションがプロファイルをどのように処理するかを見ることができます.コンフィギュレーションはstartupクラスの属性であり、構成情報はJSON、XML、環境変数などの様々なソースから取得することができ、デフォルトのテンプレートではConfigurationBuilderを使用してappsettingsを通過する.jsonと環境変数情報は、IConfigurationインスタンスを作成します.また、コンフィギュレーションを参照して、独自のカスタムconfiguration providerを作成することもできます.ConfigureServicesメソッドは、アプリケーションに提供されるサービスを指定するために使用される.デフォルトのテンプレートには、EF、Identity、MVCの3つのサービスが追加されています.ここでは、必要に応じて自分のサービスを追加することができます.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
    
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
    
        services.AddMvc();
    
        // Add application services.
        services.AddTransient<IEmailSender, AuthMessageSender>();
        services.AddTransient<ISmsSender, AuthMessageSender>();
    }
     Configureメソッドは、ConfigureServicesの後に実行時に呼び出され、例示的なプロジェクトでは、Configureがコンソールを呼び出してログを作成する.オープン環境にいくつかの有用な機能を追加するために、静的ファイル、アイデンティティ、およびMVCルーティングのサポートが追加されました.コンフィギュレーション・サービスにのみアイデンティティおよびMVCを追加するには、Configureを呼び出して要求パイプに構成する必要があります.
    ノートに全選コピー
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();
    
        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
    
            // For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859
            try
            {
                using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                    .CreateScope())
                {
                    serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
                         .Database.Migrate();
                }
            }
            catch { }
        }
    
        app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
    
        app.UseStaticFiles();
    
        app.UseIdentity();
    
        // To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715
    
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
     
    どのサービスが利用可能なのか、要求パイプをどのように構成するかは、HTTPモジュールを使用するのではなく、Startupクラスで完了しています.configでプロセッサを構成します.詳細については、アプリケーションの起動、構成、基本原理を参照してください.