Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Importante
Os aplicativos Framework e Core devem usar layouts de diretório virtual idênticos.
A configuração do diretório virtual é usada para geração de rotas, autorização e outros serviços dentro do sistema. Neste ponto, nenhum método confiável foi encontrado para habilitar diferentes diretórios virtuais devido a como ASP.NET Framework funciona.
Em alguns cenários de atualização incremental, é útil que o novo aplicativo ASP.NET Core possa se comunicar com o aplicativo ASP.NET original.
Cenários comuns que esta funcionalidade permite
- Fallback para a aplicação herdada com YARP
- Autenticação remota de aplicativos
- Sessão remota
Valores de configuração
Para permitir que o aplicativo ASP.NET Core se comunique com o aplicativo ASP.NET, é necessário fazer algumas pequenas alterações em cada aplicativo.
Você precisa configurar dois valores de configuração em ambos os aplicativos:
-
RemoteAppApiKey: Uma chave (necessária para ser analisada como um GUID) que é compartilhada entre os dois aplicativos. Este deve ser um valor GUID como12345678-1234-1234-1234-123456789012. -
RemoteAppUri: O URI do aplicativo remoto do ASP.NET Framework (necessário apenas na configuração do aplicativo ASP.NET Core). Essa deve ser a URL completa onde o aplicativo ASP.NET Framework está hospedado, comohttps://localhost:44300ouhttps://myapp.example.com.
Configurar o aplicativo ASP.NET Framework
Importante
O aplicativo ASP.NET Framework deve ser hospedado com SSL habilitado. Na configuração do aplicativo remoto para migração incremental, não é necessário ter acesso direto externamente. Recomenda-se permitir apenas o acesso a partir do aplicativo cliente através do proxy.
Para aplicativos do ASP.NET Framework, adicione estes valores ao seu web.config na <appSettings> seção :
Importante
ASP.NET Framework armazena suas appSettings no web.config. No entanto, eles podem ser recuperados de outras fontes (como variáveis de ambiente) com o uso de construtores de configuração. Isso torna o compartilhamento de valores de configuração muito mais fácil entre os aplicativos locais e remotos nesta configuração.
<appSettings>
<add key="RemoteAppApiKey" value="..." />
</appSettings>
Para configurar o aplicativo para estar disponível para lidar com as solicitações do cliente ASP.NET Core, configure o seguinte:
Instalar o pacote NuGet
Microsoft.AspNetCore.SystemWebAdapters.FrameworkServicesAdicione o código de configuração ao método
Application_Startno seu ficheiroGlobal.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... }Adicione o
SystemWebAdapterModulemódulo aoweb.configse ainda não tiver sido adicionado pelo NuGet. Essa configuração de módulo é necessária para cenários de hospedagem do IIS. OSystemWebAdapterModulemódulo não é adicionado automaticamente ao usar projetos no estilo SDK para 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>
Configurar ASP.NET aplicativo principal
Para aplicativos ASP.NET Core, adicione estes valores ao seu appsettings.json:
{
"RemoteAppApiKey": "...",
"RemoteAppUri": "https://localhost:44300"
}
Para configurar a aplicação ASP.NET Core para poder enviar solicitações para a aplicação ASP.NET, configure o cliente da aplicação remota chamando AddRemoteAppClient depois de registar os serviços do adaptador System.Web com AddSystemWebAdapters.
Adicione esta configuração ao seu Program.cs ficheiro:
builder.Services.AddSystemWebAdapters()
.AddRemoteAppClient(options =>
{
options.RemoteAppUrl = new(builder.Configuration["RemoteAppUri"]);
options.ApiKey = builder.Configuration["RemoteAppApiKey"];
});
Com os aplicativos ASP.NET e ASP.NET Core atualizados, os métodos de extensão agora podem ser usados para configurar a autenticação remota de aplicativos ou a sessão remota, conforme necessário.
Ativar proxy
Para habilitar o proxy do aplicativo ASP.NET Core para o aplicativo ASP.NET Framework, você pode configurar uma rota de fallback que encaminha solicitações incomparáveis para o aplicativo herdado. Isso permite uma migração gradual em que o aplicativo ASP.NET Core lida com a funcionalidade migrada enquanto retorna ao aplicativo original para recursos não migrados.
Instale o pacote NuGet YARP (Yet Another Reverse Proxy) seguindo as orientações mais recentes.
Adicione as declarações 'using' necessárias ao seu
Program.cs.using Microsoft.Extensions.Options; using Microsoft.AspNetCore.SystemWebAdapters;Registre os serviços de proxy reverso em seu
Program.cs:builder.Services.AddReverseProxy();Depois de criar a aplicação e configurar outro middleware, adicione o mapeamento de rota de fallback:
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();
Configuração de orquestração Aspire
Importante
Esta integração está atualmente em pré-visualização e é publicada como um pacote de pré-lançamento no NuGet.org. Ao adicionar o pacote, ative os pacotes de pré-lançamento nas suas ferramentas (por exemplo, selecione Include prerelease no Gestor de Pacotes NuGet do Visual Studio ou use a opção de pré-lançamento equivalente com a CLI .NET).
Adicionar Aspire orquestração para o aplicativo ASP.NET Framework
Adicione um novo aplicativo ASP.NET Core à solução e adicione-o à sua Aspire orquestração
Adicione o
Aspire.Hosting.IncrementalMigrationpacote ao seu projeto AppHost.Configure o IIS Express para alojar localmente a sua aplicação de framework e configurar a recuperação de migração incremental utilizando as extensões de migração incremental.
var builder = DistributedApplication.CreateBuilder(args); // Add ASP.NET Framework app with IIS Express var frameworkApp = builder.AddIISExpressProject<Projects.FrameworkApplication>("framework"); // Add ASP.NET Core app with fallback to Framework app var coreApp = builder.AddProject<Projects.CoreApplication>("core") .WithIncrementalMigrationFallback(frameworkApp, options => { options.RemoteSession = RemoteSession.Enabled; options.RemoteAuthentication = RemoteAuthentication.DefaultScheme; }); builder.Build().Run();Configure as opções da alternativa de migração incremental para os cenários que pretende apoiar.
Configurar ServiceDefaults para suportar ASP.NET Framework
Adicione o pacote
Aspire.Microsoft.AspNetCore.SystemWebAdaptersao seu aplicativo.Atualize o projeto ServiceDefaults para oferecer suporte ao .NET Framework. Isto é baseado no padrão ServiceDefaults e pode diferir se tiver personalizado alguma coisa.
Atualize a estrutura de destino para multitarget:
- <TargetFramework>net10.0</TargetFramework> + <TargetFrameworks>net481;net10.0</TargetFrameworks>Atualize o PackageReferences para levar em conta as diferentes estruturas:
<ItemGroup> <PackageReference Include="Microsoft.Extensions.Http.Resilience" /> <PackageReference Include="Microsoft.Extensions.ServiceDiscovery" /> <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)' == 'net10.0' "> <FrameworkReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" /> </ItemGroup> <ItemGroup Condition=" '$(TargetFramework)' == 'net481' "> <PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNet" /> </ItemGroup>Para habilitar a telemetria, atualize as métricas e os registros de rastreamento:
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(); });Desative os pontos de extremidade padrão, pois isso só se aplica ao ASP.NET Core:
+ #if NET public static WebApplication MapDefaultEndpoints(this WebApplication app) { // Default endpoint registrations } + #endif
Para um exemplo completo e funcional de uma configuração multidirecionada
ServiceDefaultsque suporta tanto ASP.NET Core como ASP.NET Framework, consulte o ficheiro de exemploExtensions.csno repositório System.Web adapters:https://github.com/dotnet/systemweb-adapters/blob/main/samples/ServiceDefaults/Extensions.cs.
Configurar o aplicativo ASP.NET Framework
Fazer referência ao projeto ServiceDefaults
Adicione o código de configuração ao método
Application_Startno seu ficheiroGlobal.asax.cs.protected void Application_Start() { HttpApplicationHost.RegisterHost(builder => { builder.AddServiceDefaults(); builder.AddSystemWebAdapters(); }); }
Configurar ASP.NET aplicativo principal
Fazer referência ao projeto ServiceDefaults
Adicione os adaptadores System.Web em 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();
Com esta configuração:
- As rotas locais têm precedência: se o aplicativo ASP.NET Core tiver uma rota correspondente, ele manipulará a solicitação localmente
- Fallback para aplicação herdada: solicitações não correspondentes são automaticamente encaminhadas para a aplicação ASP.NET Framework
-
Otimização de middleware: o método evita a
.ShortCircuit()execução desnecessária de middleware ao encaminhar solicitações
Essa configuração permite uma experiência de usuário perfeita durante a migração incremental, onde os usuários podem acessar a funcionalidade migrada e herdada por meio de um único ponto de extremidade.