Von Bedeutung
フレームワークとコア アプリケーションでは、同じ仮想ディレクトリ レイアウトを使用する必要があります。
仮想ディレクトリのセットアップは、システム内のルートの生成、承認、およびその他のサービスに使用されます。 この時点で、ASP.NET Framework のしくみにより、異なる仮想ディレクトリを有効にする信頼性の高い方法は見つかりませんでした。
一部の増分アップグレード シナリオでは、新しい ASP.NET Core アプリが元の ASP.NET アプリと通信できるようになると便利です。
一般的なシナリオでは、次のことが可能になります。
- YARP を使用してレガシ アプリケーションにフォールバックする
- リモート アプリ認証
- リモート セッション
設定値
ASP.NET Core アプリが ASP.NET アプリと通信できるようにするには、各アプリに少し変更を加える必要があります。
両方のアプリケーションで 2 つの構成値を構成する必要があります。
-
RemoteAppApiKey: 2 つのアプリケーション間で共有されるキー ( GUID として解析可能である必要があります)。 これは、12345678-1234-1234-1234-123456789012のような GUID 値である必要があります。 -
RemoteAppUri: リモート ASP.NET Framework アプリケーションの URI (ASP.NET Core アプリケーション構成でのみ必要)。 これは、https://localhost:44300やhttps://myapp.example.comなど、ASP.NET Framework アプリがホストされている完全な URL である必要があります。
ASP.NET Framework アプリケーションの構成
Von Bedeutung
ASP.NET Framework アプリケーションは、SSL を有効にしてホストする必要があります。 増分移行用のリモート アプリのセットアップでは、外部から直接アクセスする必要はありません。 プロキシ経由でクライアント アプリケーションからのアクセスのみを許可することをお勧めします。
ASP.NET Framework アプリケーションの場合は、次の値を web.config セクションの<appSettings>に追加します。
Von Bedeutung
ASP.NET Framework では、appSettings が web.configに格納されます。 ただし、 構成ビルダーを使用して、他のソース (環境変数など) から取得できます。 これにより、このセットアップでローカル アプリケーションとリモート アプリケーション間で構成値を簡単に共有できるようになります。
<appSettings>
<add key="RemoteAppApiKey" value="..." />
</appSettings>
ASP.NET Core クライアントからの要求を処理できるようにアプリケーションを構成するには、次を設定します。
NuGet パッケージをインストールする
Microsoft.AspNetCore.SystemWebAdapters.FrameworkServicesApplication_StartファイルのGlobal.asax.csメソッドに構成コードを追加します。protected void Application_Start() { HttpApplicationHost.RegisterHost(builder => { builder.AddSystemWebAdapters() .AddRemoteAppServer(options => { // ApiKey is a string representing a GUID options.ApiKey = System.Configuration.ConfigurationManager.AppSettings["RemoteAppApiKey"]; }); }); // ...existing code... }NuGet によってまだ追加されていない場合は、
SystemWebAdapterModuleモジュールをweb.configに追加します。 このモジュール構成は、IIS ホスティング シナリオに必要です。 ASP.NET Core に SDK スタイル プロジェクトを使用する場合、SystemWebAdapterModuleモジュールは自動的に追加されません。<system.webServer> <modules> + <remove name="SystemWebAdapterModule" /> + <add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices" preCondition="managedHandler" /> </modules> </system.webServer>
コア アプリケーション ASP.NET 構成する
ASP.NET Core アプリケーションの場合は、次の値を appsettings.jsonに追加します。
{
"RemoteAppApiKey": "...",
"RemoteAppUri": "https://localhost:44300"
}
ASP.NET アプリに要求を送信できるように ASP.NET Core アプリを設定するには、System.Web アダプター サービスを AddRemoteAppClient に登録した後、AddSystemWebAdaptersを呼び出してリモート アプリ クライアントを構成します。
Program.cs ファイルに次の構成を追加します。
builder.Services.AddSystemWebAdapters()
.AddRemoteAppClient(options =>
{
options.RemoteAppUrl = new(builder.Configuration["RemoteAppUri"]);
options.ApiKey = builder.Configuration["RemoteAppApiKey"];
});
ASP.NET と ASP.NET Core アプリの両方が更新されたので、拡張メソッドを使用して、必要に応じて リモート アプリ認証 または リモート セッションを設定できるようになりました。
プロキシを有効にする
ASP.NET Core アプリケーションから ASP.NET Framework アプリケーションへのプロキシを有効にするには、一致しない要求をレガシ アプリケーションに転送するフォールバック ルートを設定できます。 これにより、ASP.NET Core アプリが移行された機能を処理しながら、移行されていない機能のために元のアプリにフォールバックする段階的な移行が可能になります。
最新のガイダンスに従って、YARP (さらに別のリバース プロキシ) NuGet パッケージをインストールします。
必要な using ステートメントを
Program.csに追加します。using Microsoft.Extensions.Options; using Microsoft.AspNetCore.SystemWebAdapters;リバース プロキシ サービスを
Program.csに登録します。builder.Services.AddReverseProxy();アプリをビルドして他のミドルウェアを構成した後、フォールバック ルート マッピングを追加します。
var app = builder.Build(); // Configure your other middleware here (authentication, routing, etc.) // Map the fallback route app.MapForwarder("/{**catch-all}", app.Services.GetRequiredService<IOptions<RemoteAppClientOptions>>().Value.RemoteAppUrl.OriginalString) // Ensures this route has the lowest priority (runs last) .WithOrder(int.MaxValue) // Skips remaining middleware when this route matches .ShortCircuit(); app.Run();
オーケストレーション Aspire セットアップ
Von Bedeutung
これはまだプレビュー段階であり、NuGet.org では使用できないため、.NET ライブラリの毎日のフィードからライブラリをプルするように NuGet 構成を構成する必要があります。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
<clear />
<add key="nuget" value="https://api.nuget.org/v3/index.json" />
<add key=".NET Libraries Daily" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-libraries/nuget/v3/index.json" />
</packageSources>
</configuration>
注: これには、System.Web アダプター以降の v2.0.1-preview1.25351.5 が必要です。
Warnung
注: これは、 Aspireでアプリケーションを実行するのに役立つサード パーティ製コンポーネントです。 現時点では、ASP.NET Framework アプリケーションは Aspireで直接サポートされていませんが、このプロジェクトはこれに役立ちます。 この依存関係はビルドと開発を目的としていますが、運用環境にデプロイする必要はありません。
ASP.NET Framework アプリケーション用のオーケストレーションAspireを追加する
ソリューションに新しい ASP.NET Core アプリケーションを追加し、 Aspire オーケストレーションに追加する
IIS 統合で次のことが必要な場合に、AppHost を更新して Windows をターゲットにします。
- <TargetFramework>net9.0</TargetFramework> + <TargetFramework>net9.0-windows</TargetFramework>アプリ ホストに次の Aspire 統合を追加します。
Aspire.Hosting.IncrementalMigrationC3D.Extensions.Aspire.IISExpress
フレームワーク アプリケーションをローカルでホストするように IIS Express を構成し、増分移行フォールバックを構成します。
var builder = DistributedApplication.CreateBuilder(args); var frameworkApp = builder.AddIISExpress("iis") .AddSiteProject<Projects.FrameworkApplication>("framework") .WithDefaultIISExpressEndpoints() .WithOtlpExporter() .WithHttpHealthCheck(); var coreApp = builder.AddProject<Projects.CoreApplication>("core") .WithHttpHealthCheck() .WaitFor(frameworkApp) .WithIncrementalMigrationFallback(frameworkApp, options => options.RemoteSession = RemoteSession.Enabled); builder.Build().Run();サポートするシナリオの増分移行フォールバックのオプションを構成します。
ASP.NET Framework をサポートするように ServiceDefaults を構成する
- パッケージ
Aspire.Microsoft.AspNetCore.SystemWebAdaptersをアプリケーションに追加します。 - .NET Framework をサポートするように ServiceDefaults プロジェクトを更新します。 これは既定の ServiceDefaults に基づいており、何かをカスタマイズした場合は異なる場合があります。
ターゲット フレームワークをマルチターゲットに更新します。
- <TargetFramework>net9.0</TargetFramework> + <TargetFrameworks>net9.0;net48</TargetFrameworks>さまざまなフレームワークを考慮するように PackageReferences を更新します。
<ItemGroup> <PackageReference Include="Microsoft.Extensions.Http.Resilience" /> <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" /> <PackageReference Include="OpenTelemetry.Extensions.Hosting" /> <PackageReference Include="OpenTelemetry.Instrumentation.Http" /> <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" /> <PackageReference Include="OpenTelemetry.Instrumentation.SqlClient" /> </ItemGroup> <ItemGroup Condition=" '$(TargetFramework)' == 'net9.0'"> <FrameworkReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.Extensions.ServiceDiscovery" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" /> </ItemGroup> <ItemGroup Condition=" '$(TargetFramework)' == 'net48' "> <PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNet" /> </ItemGroup>Extensions.cs ファイルでは、.NET Framework で現在サポートされていないため、ServiceDiscovery API を条件付きで除外する必要があります。
+ #if NET builder.Services.AddServiceDiscovery(); + #endif builder.Services.ConfigureHttpClientDefaults(http => { // Turn on resilience by default http.AddStandardResilienceHandler(); + #if NET // Turn on service discovery by default http.AddServiceDiscovery(); + #endif });テレメトリを有効にするには、メトリックとトレース登録を更新します。
builder.Services.AddOpenTelemetry() .WithMetrics(metrics => { metrics + #if NET .AddAspNetCoreInstrumentation() + #else + .AddAspNetInstrumentation() + #endif .AddSqlClientInstrumentation() .AddHttpClientInstrumentation() .AddRuntimeInstrumentation(); }) .WithTracing(tracing => { tracing.AddSource(builder.Environment.ApplicationName) + #if NET .AddAspNetCoreInstrumentation() + #else + .AddAspNetInstrumentation() + #endif .AddSqlClientInstrumentation() .AddHttpClientInstrumentation(); });ASP.NET Core にのみ適用されるため、既定のエンドポイントを無効にします。
+ #if NET public static WebApplication MapDefaultEndpoints(this WebApplication app) { // Default endpoint registrations } + #endif
ASP.NET Framework アプリケーションの構成
ServiceDefaults プロジェクトを参照する
Application_StartファイルのGlobal.asax.csメソッドに構成コードを追加します。protected void Application_Start() { HttpApplicationHost.RegisterHost(builder => { builder.AddServiceDefaults(); builder.AddSystemWebAdapters(); }); }
コア アプリケーション ASP.NET 構成する
ServiceDefaults プロジェクトを参照する
Programs.csに System.Web アダプターを追加します。
var builder = WebApplication.CreateBuilder(); builder.AddServiceDefaults(); + builder.AddSystemWebAdapters(); ... var app = builder.Build(); ... + // Must be placed after routing if manually added + app.UseSystemWebAdapters(); ... + app.MapRemoteAppFallback() + + // Optional, but recommended unless middleware is needed + .ShortCircuit(); app.Run();
この構成では次のようになります。
- ローカル ルートが優先されます。ASP.NET Core アプリケーションに一致するルートがある場合、要求はローカルで処理されます
- レガシ アプリへのフォールバック: 一致しない要求は、ASP.NET Framework アプリケーションに自動的に転送されます
-
ミドルウェアの最適化:
.ShortCircuit()メソッドは、要求を転送するときに不要なミドルウェアの実行を防ぎます
このセットアップにより、増分移行中にシームレスなユーザー エクスペリエンスが可能になり、ユーザーは単一のエンドポイントを介して移行された機能とレガシ機能の両方にアクセスできます。
ASP.NET Core