次の方法で共有


リモート アプリのセットアップ

Von Bedeutung

フレームワークとコア アプリケーションでは、同じ仮想ディレクトリ レイアウトを使用する必要があります。

仮想ディレクトリのセットアップは、システム内のルートの生成、承認、およびその他のサービスに使用されます。 この時点で、ASP.NET Framework のしくみにより、異なる仮想ディレクトリを有効にする信頼性の高い方法は見つかりませんでした。

一部の増分アップグレード シナリオでは、新しい ASP.NET Core アプリが元の ASP.NET アプリと通信できるようになると便利です。

一般的なシナリオでは、次のことが可能になります。

設定値

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:44300https://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 クライアントからの要求を処理できるようにアプリケーションを構成するには、次を設定します。

  1. NuGet パッケージをインストールする Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices

  2. Application_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...
    }
    
  3. 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 アプリが移行された機能を処理しながら、移行されていない機能のために元のアプリにフォールバックする段階的な移行が可能になります。

  1. 最新のガイダンスに従って、YARP (さらに別のリバース プロキシ) NuGet パッケージをインストールします。

  2. 必要な using ステートメントを Program.csに追加します。

    using Microsoft.Extensions.Options;
    using Microsoft.AspNetCore.SystemWebAdapters;
    
  3. リバース プロキシ サービスを Program.csに登録します。

    builder.Services.AddReverseProxy();
    
  4. アプリをビルドして他のミドルウェアを構成した後、フォールバック ルート マッピングを追加します。

    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で直接サポートされていませんが、このプロジェクトはこれに役立ちます。 この依存関係はビルドと開発を目的としていますが、運用環境にデプロイする必要はありません。

  1. ASP.NET Framework アプリケーション用のオーケストレーションAspireを追加する

  2. ソリューションに新しい ASP.NET Core アプリケーションを追加し、 Aspire オーケストレーションに追加する

  3. IIS 統合で次のことが必要な場合に、AppHost を更新して Windows をターゲットにします。

    - <TargetFramework>net9.0</TargetFramework>
    + <TargetFramework>net9.0-windows</TargetFramework>
    
  4. アプリ ホストに次の Aspire 統合を追加します。

    • Aspire.Hosting.IncrementalMigration
    • C3D.Extensions.Aspire.IISExpress
  5. フレームワーク アプリケーションをローカルでホストするように 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();
    
  6. サポートするシナリオの増分移行フォールバックのオプションを構成します。

ASP.NET Framework をサポートするように ServiceDefaults を構成する

  1. パッケージ Aspire.Microsoft.AspNetCore.SystemWebAdapters をアプリケーションに追加します。
  2. .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 アプリケーションの構成

  1. ServiceDefaults プロジェクトを参照する

  2. Application_Start ファイルの Global.asax.cs メソッドに構成コードを追加します。

    protected void Application_Start()
    {
        HttpApplicationHost.RegisterHost(builder =>
        {
            builder.AddServiceDefaults();
            builder.AddSystemWebAdapters();
        });
    }
    

コア アプリケーション ASP.NET 構成する

  1. ServiceDefaults プロジェクトを参照する

  2. 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();
    

この構成では次のようになります。

  1. ローカル ルートが優先されます。ASP.NET Core アプリケーションに一致するルートがある場合、要求はローカルで処理されます
  2. レガシ アプリへのフォールバック: 一致しない要求は、ASP.NET Framework アプリケーションに自動的に転送されます
  3. ミドルウェアの最適化: .ShortCircuit() メソッドは、要求を転送するときに不要なミドルウェアの実行を防ぎます

このセットアップにより、増分移行中にシームレスなユーザー エクスペリエンスが可能になり、ユーザーは単一のエンドポイントを介して移行された機能とレガシ機能の両方にアクセスできます。