Dela via


Installation av fjärrapp

Viktigt!

Framework- och Core-program måste använda identiska layouter för virtuella kataloger.

Konfigurationen av den virtuella katalogen används för väggenerering, auktorisering och andra tjänster i systemet. I det här läget har ingen tillförlitlig metod hittats för att aktivera olika virtuella kataloger på grund av hur ASP.NET Framework fungerar.

I vissa inkrementella uppgraderingsscenarier är det användbart för den nya ASP.NET Core-appen att kunna kommunicera med den ursprungliga ASP.NET appen.

Vanliga scenarier som gör det möjligt att:

Konfigurationsvärden

För att göra det möjligt för ASP.NET Core-appen att kommunicera med ASP.NET-appen är det nödvändigt att göra några små ändringar i varje app.

Du måste konfigurera två konfigurationsvärden i båda programmen:

  • RemoteAppApiKey: En nyckel (krävs för att kunna tolkas som ett GUID) som delas mellan de två programmen. Detta bör vara ett GUID-värde som 12345678-1234-1234-1234-123456789012.
  • RemoteAppUri: URI:n för det fjärranslutna ASP.NET Framework-programmet (krävs endast i ASP.NET Core-programkonfigurationen). Detta bör vara den fullständiga URL:en där ASP.NET Framework-appen finns, till exempel https://localhost:44300 eller https://myapp.example.com.

Konfigurera ASP.NET Framework-program

Viktigt!

ASP.NET Framework-programmet ska finnas med SSL aktiverat. I fjärrappkonfigurationen för inkrementell migrering krävs det inte att du har direkt åtkomst externt. Vi rekommenderar att du endast tillåter åtkomst från klientprogrammet via proxyn.

För ASP.NET Framework-program lägger du till dessa värden i web.config-sektionen i <appSettings>.

Viktigt!

ASP.NET Framework lagrar sina appInställningar i web.config. De kan dock hämtas från andra källor (till exempel miljövariabler) med hjälp av configuration Builders. Detta gör det mycket enklare att dela konfigurationsvärden mellan lokala program och fjärrprogram i den här konfigurationen.

<appSettings>
  <add key="RemoteAppApiKey" value="..." />
</appSettings>

Konfigurera följande för att konfigurera programmet att vara tillgängligt för att hantera begäranden från ASP.NET Core-klienten:

  1. Installera NuGet-paketet Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices

  2. Lägg till konfigurationskoden i Application_Start -metoden i Global.asax.cs filen:

    protected void Application_Start()
    {
        SystemWebAdapterConfiguration.AddSystemWebAdapters(this)
            .AddRemoteAppServer(options =>
            {
                // ApiKey is a string representing a GUID
                options.ApiKey = ConfigurationManager.AppSettings["RemoteAppApiKey"];
            });
    
        // ...existing code...
    }
    
  3. Lägg till modulen SystemWebAdapterModule i web.config om den inte redan har lagts till av NuGet. Den här modulkonfigurationen krävs för IIS-värdscenarier. Modulen SystemWebAdapterModule läggs inte till automatiskt när du använder SDK-formatprojekt för ASP.NET Core.

      <system.webServer>
        <modules>
    +      <remove name="SystemWebAdapterModule" />
    +      <add name="SystemWebAdapterModule" type="Microsoft.AspNetCore.SystemWebAdapters.SystemWebAdapterModule, Microsoft.AspNetCore.SystemWebAdapters.FrameworkServices" preCondition="managedHandler" />
        </modules>
    </system.webServer>
    

Konfigurera ASP.NET Core-applikation

För ASP.NET Core-program lägger du till dessa värden i :appsettings.json

{
  "RemoteAppApiKey": "...",
  "RemoteAppUri": "https://localhost:44300"
}

Om du vill konfigurera ASP.NET Core-appen så att den kan skicka begäranden till ASP.NET-appen konfigurerar du fjärrappklienten genom att anropa AddRemoteAppClient efter registreringen av System.Web adapter-tjänster med AddSystemWebAdapters.

Lägg till den här konfigurationen i Program.cs filen:

builder.Services.AddSystemWebAdapters()
    .AddRemoteAppClient(options =>
    {
        options.RemoteAppUrl = new(builder.Configuration["RemoteAppUri"]);
        options.ApiKey = builder.Configuration["RemoteAppApiKey"];
    });

Med både ASP.NET och ASP.NET Core-appar uppdaterade kan tilläggsmetoder nu användas för att konfigurera fjärrappautentisering eller fjärrsession efter behov.

Aktivera proxy

Om du vill aktivera proxy från ASP.NET Core-programmet till ASP.NET Framework-programmet kan du konfigurera en återställningsväg som vidarebefordrar omatchade begäranden till det äldre programmet. Detta möjliggör en gradvis migrering där ASP.NET Core-appen hanterar migrerade funktioner samtidigt som den återgår till den ursprungliga appen för omigrerade funktioner.

  1. Installera NUGet-paketet YARP (Yet Another Reverse Proxy) enligt den senaste vägledningen.

  2. Lägg till de nödvändiga användningsinstruktionerna i :Program.cs

    using Microsoft.Extensions.Options;
    using Microsoft.AspNetCore.SystemWebAdapters;
    
  3. Registrera de omvända proxytjänsterna i dina Program.cs

    builder.Services.AddReverseProxy();
    
  4. När du har skapat appen och konfigurerat andra mellanprogram lägger du till återställningsvägens mappning:

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

Konfigurera Aspire-orkestrering

Viktigt!

Detta är fortfarande i förhandsversion och är inte tillgängligt på NuGet.org, så du måste konfigurera Din NuGet-konfiguration för att hämta bibliotek från .NET-bibliotekens dagliga flöde:

<?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>

NOTERA: Detta kräver v2.0.1-preview1.25351.5 av System.Web-adaptrar eller senare.

Varning

Obs! Det här är en komponent från tredje part som hjälper dig att köra programmet i Aspire. För närvarande stöds inte ASP.NET Framework-program direkt i Aspire, men det här projektet hjälper till med det. Det här beroendet är avsett för bygg och utveckling, men behöver inte sättas i produktion.

  1. Lägg till Aspire-orkestrering för ASP.NET Framework-programmet

  2. Lägg till ett nytt ASP.NET Core-program i lösningen och lägg till det i Din Aspire-orkestrering

  3. Uppdatera AppHost så att den riktar in sig på Windows eftersom IIS-integrering kräver följande:

    - <TargetFramework>net9.0</TargetFramework>
    + <TargetFramework>net9.0-windows</TargetFramework>
    
  4. Lägg till följande Aspire-integreringar i appvärden:

    • Aspire.Hosting.IncrementalMigration
    • C3D.Extensions.Aspire.IISExpress
  5. Konfigurera IIS Express för att lokalt vara värd för ditt ramverksprogram och konfigurera inkrementell migreringsåterställning:

    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. Konfigurera alternativen för inkrementell migreringsåterställning för de scenarier som du vill stödja.

Konfigurera ServiceDefaults för att stödja ASP.NET Framework

  1. Lägg till paketet Aspire.Microsoft.AspNetCore.SystemWebAdapters i ditt program.
  2. Uppdatera ServiceDefaults-projektet för att stödja .NET Framework. Detta baseras på Standard ServiceDefaults och kan skilja sig åt om du har anpassat något.
    • Uppdatera målramverket till multitarget:

      - <TargetFramework>net9.0</TargetFramework>
      + <TargetFrameworks>net9.0;net48</TargetFrameworks>
      
    • Uppdatera PackageReferences för att ta hänsyn till de olika ramverken:

       <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>
      
    • I filen Extensions.cs måste du villkorligt exkludera API:erna för ServiceDiscovery eftersom de för närvarande inte stöds i .NET Framework:

      + #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
              });
      
    • Om du vill aktivera telemetri uppdaterar du måtten och spårningsregistreringarna:

              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();
                  });
      
    • Inaktivera standardslutpunkterna eftersom det endast gäller för ASP.NET Core:

      + #if NET
          public static WebApplication MapDefaultEndpoints(this WebApplication app)
          {
              // Default endpoint registrations
          }
      + #endif
      

Konfigurera ASP.NET Framework-program

  1. Referera till ServiceDefaults-projektet

  2. Lägg till konfigurationskoden i Application_Start -metoden i Global.asax.cs filen:

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

Konfigurera ASP.NET Core-applikation

  1. Referera till ServiceDefaults-projektet

  2. Lägg till System.Web-adaptrar i Programs.cs:

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

Med den här konfigurationen:

  1. Lokala vägar har företräde: Om ASP.NET Core-programmet har en matchande väg hanterar det begäran lokalt
  2. Återställning till äldre app: Omatchade begäranden vidarebefordras automatiskt till ASP.NET Framework-programmet
  3. Optimering av mellanprogram: Metoden .ShortCircuit() förhindrar onödig körning av mellanprogram vid vidarebefordran av begäranden

Den här konfigurationen möjliggör en sömlös användarupplevelse under inkrementell migrering, där användare kan komma åt både migrerade och äldre funktioner via en enda slutpunkt.