Compartilhar via


Atualizar um projeto do lado do servidor do WCF para usar CoreWCF no .NET 6

Importante

Este artigo foi escrito antes do lançamento da extensão do Assistente de atualização para Visual Studio e usa a ferramenta da CLI herdada. Para obter mais informações, confira Usar o Assistente de Atualização do .NET herdado.

O Assistente de Atualização do .NET é uma ferramenta de linha de comando que pode ajudar na atualização de um projeto existente do lado do servidor do WCF em .NET Framework para usar serviços CoreWCF no .NET 6. Esse artigo fornece:

  • O que você deve saber antes de começar.
  • Uma demonstração de como executar a ferramenta em um projeto do lado do servidor do WCF em .NET Framework.
  • Dicas para solução de problemas.

Para obter mais informações sobre como instalar a ferramenta, confira Usar o Assistente de Atualização do .NET herdado.

O que você deve saber antes de começar

Atualmente, essa ferramenta dá suporte a projetos C# e usa o CoreWCF para portar projetos auto-hospedados do lado do servidor do WCF para o .NET 6.

Para que um projeto WCF seja aplicável a essa atualização, ele deverá atender aos seguintes requisitos:

  1. Incluir um arquivo .cs que faz referência a System.ServiceModel e cria um ServiceHost.

    Se o projeto WCF tiver vários ServiceHost, todos os hosts precisarão ser criados no mesmo método.

  2. Inclui um arquivo .config que armazena propriedades System.ServiceModel.

A versão atual da ferramenta não dá suporte a projetos do WCF hospedados por meio de arquivos .svc.

Observação

Se o projeto não for aplicável a essa ferramenta, recomendamos que você dê uma olhada no guia passo a passo do CoreWCF e na demonstração de amostra do Beantrader e atualize manualmente o projeto.

Aplicativo de demonstração

Você pode usar o projeto Amostra de Calculadora Básica para testar a atualização com o Assistente de Atualização, que também é a demonstração usada nesta documentação.

Se você quiser experimentar uma amostra mais complicada, consulte a amostra Beantrader criada por Mike Rousos.

Executar o assistente de atualização

Abra um terminal e navegue até a pasta em que o projeto ou a solução de destino está localizado. Execute o comando upgrade-assistant upgrade, passando o nome do projeto ou da solução que você está atualizando.

Quando um projeto é fornecido, o processo de atualização começa imediatamente nesse projeto. Se uma solução for fornecida, você selecionará qual projeto executará normalmente, conhecido como ponto de entrada da atualização. Com base nesse projeto, um grafo de dependência é criado e uma sugestão da ordem em que você deve atualizar os projetos é fornecida.

upgrade-assistant upgrade .\CalculatorSample.sln

A ferramenta é executada e mostra uma lista das etapas que ela executará. Conforme cada etapa é concluída, a ferramenta fornece um conjunto de comandos que permitem que o usuário aplique ou ignore a próxima etapa. Outras opções são:

  • Obter mais informações sobre a etapa.
  • Alterar projetos.
  • Ajustar as configurações de registro em log.
  • Parar a atualização e sair.

Pressionar Enter sem escolher um número seleciona o primeiro item da lista.

À medida que cada etapa é inicializada, ela pode fornecer informações sobre o que poderá acontecer se você aplicá-la.

Selecione o ponto de entrada e o projeto para atualizar

A primeira etapa na atualização da amostra de calculadora básica é escolher qual projeto na solução serve como o projeto de ponto de entrada.

Upgrade Steps

1. [Next step] Select an entrypoint
2. Select project to upgrade

Choose a command:
   1. Apply next step (Select an entrypoint)
   2. Skip next step (Select an entrypoint)
   3. See more step details
   4. Configure logging
   5. Exit

Escolha o comando 1 para iniciar essa etapa. Os resultados são exibidos:

[10:25:42 INF] Applying upgrade step Select an entrypoint
Please select the project you run. We will then analyze the dependencies and identify the recommended order to upgrade projects.
   1. CalculatorClient
   2. CalculatorService

Há dois projetos listados. Como nossa ferramenta atualiza o projeto do lado do servidor, escolheremos o comando 2 para selecionar o projeto de serviço como o ponto de entrada.

Atualizar o projeto

Depois que um projeto for selecionado, será listada uma lista de etapas de atualização que a ferramenta executará.

Importante

Com base no projeto que você está atualizando, você pode ou não ver todas as etapas listadas neste exemplo.

A seguinte saída descreve as etapas envolvidas na atualização do projeto:

Upgrade Steps

Entrypoint: C:\Users\Desktop\CalculatorSample\CalculatorService\CalculatorService.csproj
Current Project: C:\Users\Desktop\CalculatorSample\CalculatorService\CalculatorService.csproj

1. [Next step] Back up project
2. Convert project file to SDK style
3. Clean up NuGet package references
    a. Duplicate reference analyzer
    b. Package map reference analyzer
    c. Target compatibility reference analyzer
    d. Upgrade assistant reference analyzer
    e. Windows Compatibility Pack Analyzer
    f. MyDotAnalyzer reference analyzer
    g. Newtonsoft.Json reference analyzer
    h. Windows App SDK package analysis
    i. Transitive reference analyzer
4. Update TFM
5. Update NuGet Packages
    a. Duplicate reference analyzer
    b. Package map reference analyzer
    c. Target compatibility reference analyzer
    d. Upgrade assistant reference analyzer
    e. Windows Compatibility Pack Analyzer
    f. MyDotAnalyzer reference analyzer
    g. Newtonsoft.Json reference analyzer
    h. Windows App SDK package analysis
    i. Transitive reference analyzer
6. Add template files
7. Update WCF service to CoreWCF (Preview)
8. Upgrade app config files
    a. Convert Application Settings
    b. Convert Connection Strings
    c. Disable unsupported configuration sections
9. Update source code
    a. Apply fix for UA0002: Types should be upgraded
    b. Apply fix for UA0012: 'UnsafeDeserialize()' does not exist
    c. Apply fix for UA0014: .NET MAUI projects should not reference Xamarin.Forms namespaces
    d. Apply fix for UA0015: .NET MAUI projects should not reference Xamarin.Essentials namespaces
10. Move to next project

Choose a command:
   1. Apply next step (Back up project)
   2. Skip next step (Back up project)
   3. See more step details
   4. Select different project
   5. Configure logging
   6. Exit

Observação

No restante deste artigo, as etapas de atualização não são mostradas explicitamente, a menos que haja algo importante a ser chamado. Os resultados de cada etapa ainda são mostrados.

Criar um backup

Neste exemplo de atualização do projeto CalculatorService, você aplicará cada etapa. A primeira etapa, o comando 1, faz backup do projeto:

[10:25:52 INF] Applying upgrade step Back up project
Please choose a backup path
   1. Use default path [C:\Users\Desktop\CalculatorSample.backup]
   2. Enter custom path

A ferramenta escolhe um caminho de backup padrão com o nome da pasta atual e .backup acrescentado. Você pode escolher um caminho personalizado como alternativa ao caminho padrão. Para cada projeto atualizado, a pasta do projeto é copiada para a pasta de backup. Neste exemplo, a pasta CalculatorService é copiada de CalculatorSample\CalculatorService para CalculatorSample.backup\CalculatorService durante a etapa de backup:

[10:25:53 INF] Backing up C:\Users\Desktop\CalculatorSample\CalculatorService to C:\Users\t-simonaliao\OneDrive - Microsoft\Desktop\CalculatorSample.backup\CalculatorService
[10:25:53 INF] Project backed up to C:\Users\Desktop\CalculatorSample.backup\CalculatorService
[10:25:53 INF] Upgrade step Back up project applied successfully
Please press enter to continue...

Atualizar o arquivo de projeto

O projeto é atualizado do formato de projeto .NET Framework para o formato de projeto do SDK do .NET.

[10:25:56 INF] Applying upgrade step Convert project file to SDK style
[10:25:56 INF] Converting project file format with try-convert, version 0.4.0-dev
[10:25:56 INF] Recommending executable TFM net6.0 because the project builds to an executable
C:\Users\Desktop\CalculatorSample\CalculatorService\CalculatorService.csproj contains an App.config file. App.config is replaced by appsettings.json in .NET Core. You will need to delete App.config and migrate to appsettings.json if it's applicable to your project.
[10:25:58 INF] Converting project C:\Users\CalculatorSample\CalculatorService\CalculatorService.csproj to SDK style
[10:25:58 INF] Project file converted successfully! The project may require additional changes to build successfully against the new .NET target.
[10:26:00 INF] Upgrade step Convert project file to SDK style applied successfully

Fique atento à saída de cada etapa. Observe que a saída de exemplo indica que você terá uma etapa manual a ser concluída após a atualização:

App.config é substituído por appsettings.json no .NET Core. Você precisará excluir o App.config e migrar para o appsettings.json, se for aplicável ao projeto.

Neste exemplo, a etapa de atualização do WCF criará uma wcf.config com base na system.serviceModel seção em App.config. Não precisaremos migrar para appsettings.json.

Limpar as referências do NuGet

Depois que o formato do projeto for atualizado, a próxima etapa será limpar as referências do pacote NuGet.

Além dos pacotes referenciados pelo aplicativo, o arquivo packages.config contém referências às dependências desses pacotes. Por exemplo, se você adicionou uma referência ao pacote A que depende do pacote B, os dois pacotes serão referenciados no arquivo packages.config. No novo sistema de projeto, apenas a referência ao pacote A é necessária. Essa etapa analisa as referências do pacote e remove aquelas que não são necessárias.

[10:26:01 INF] Initializing upgrade step Clean up NuGet package references
[10:26:01 INF] Initializing upgrade step Duplicate reference analyzer
[10:26:01 INF] No package updates needed
[10:26:01 INF] Initializing upgrade step Package map reference analyzer
[10:26:01 INF] Marking assembly reference System.configuration for removal based on package mapping configuration System.Configuration
[10:26:01 INF] Adding package System.Configuration.ConfigurationManager based on package mapping configuration System.Configuration
[10:26:01 INF] Marking assembly reference System.ServiceModel for removal based on package mapping configuration System.ServiceModel
[10:26:01 INF] Adding package System.ServiceModel.Primitives based on package mapping configuration System.ServiceModel
[10:26:01 INF] Adding package System.ServiceModel.Http based on package mapping configuration System.ServiceModel
[10:26:01 INF] Adding package System.ServiceModel.Duplex based on package mapping configuration System.ServiceModel
[10:26:01 INF] Adding package System.ServiceModel.NetTcp based on package mapping configuration System.ServiceModel
[10:26:01 INF] Adding package System.ServiceModel.Security based on package mapping configuration System.ServiceModel
[10:26:01 INF] Adding package System.ServiceModel.Federation based on package mapping configuration System.ServiceModel

[10:26:01 INF] Initializing upgrade step Remove reference 'System.configuration'
[10:26:03 INF] Applying upgrade step Remove reference 'System.configuration'
[10:26:03 INF] Removing outdated assembly reference: System.configuration
[10:26:03 INF] Upgrade step Remove reference 'System.configuration' applied successfully

[10:26:05 INF] Initializing upgrade step Remove reference 'System.ServiceModel'
[10:26:06 INF] Applying upgrade step Remove reference 'System.ServiceModel'
[10:26:06 INF] Removing outdated assembly reference: System.ServiceModel
[10:26:06 INF] Upgrade step Remove reference 'System.ServiceModel' applied successfully

[10:26:07 INF] Initializing upgrade step Add package 'System.Configuration.ConfigurationManager'
[10:26:09 INF] Applying upgrade step Add package 'System.Configuration.ConfigurationManager'
[10:26:09 INF] Adding package reference: System.Configuration.ConfigurationManager, Version=5.0.0
[10:26:09 INF] Upgrade step Add package 'System.Configuration.ConfigurationManager' applied successfully
[10:26:09 INF] Applying upgrade step Package map reference analyzer
[10:26:09 INF] Upgrade step Package map reference analyzer applied successfully

[10:26:10 INF] Initializing upgrade step Target compatibility reference analyzer
[10:26:10 INF] No package updates needed
[10:26:10 INF] Initializing upgrade step Upgrade assistant reference analyzer
[10:26:11 INF] Reference to .NET Upgrade Assistant analyzer package (Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers, version 0.4.336902) needs to be added
[10:26:11 INF] Initializing upgrade step Add package 'Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers'
[10:26:13 INF] Applying upgrade step Add package 'Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers'
[10:26:13 INF] Adding package reference: Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers, Version=0.4.336902
[10:26:13 INF] Upgrade step Add package 'Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers' applied successfully
[10:26:13 INF] Applying upgrade step Upgrade assistant reference analyzer
[10:26:14 INF] Upgrade step Upgrade assistant reference analyzer applied successfully

[10:26:15 INF] Initializing upgrade step Windows Compatibility Pack Analyzer
[10:26:15 INF] No package updates needed
[10:26:15 INF] Initializing upgrade step MyDotAnalyzer reference analyzer
[10:26:15 INF] No package updates needed
[10:26:15 INF] Initializing upgrade step Newtonsoft.Json reference analyzer
[10:26:15 INF] No package updates needed
[10:26:15 INF] Initializing upgrade step Windows App SDK package analysis
[10:26:15 INF] No package updates needed
[10:26:15 INF] Initializing upgrade step Transitive reference analyzer
[10:26:15 INF] No package updates needed
[10:26:15 INF] Applying upgrade step Clean up NuGet package references
[10:26:15 INF] Upgrade step Clean up NuGet package references applied successfully

O aplicativo ainda está fazendo referência a assemblies do .NET Framework. Alguns desses assemblies podem estar disponíveis como pacotes NuGet. Esta etapa analisa esses assemblies e faz referência ao pacote NuGet apropriado.

Neste exemplo, o atualizador de pacote detecta o CalculatorService como um projeto somente de servidor e não há necessidade de incluir pacotes System.ServiceModel. Mesmo que eles tenham sido adicionados à lista com base na configuração do mapeamento do pacote, essas etapas não foram aplicadas.

Manipular o TFM

Depois, a ferramenta altera o TFM do .NET Framework para o SDK sugerido. Neste exemplo, é net6.0-windows.

[10:26:17 INF] Applying upgrade step Update TFM
[10:26:17 INF] Recommending executable TFM net6.0 because the project builds to an executable
[10:26:19 INF] Updated TFM to net6.0
[10:26:19 INF] Upgrade step Update TFM applied successfully

Atualizar pacotes NuGet

Depois, a ferramenta atualiza os pacotes NuGet do projeto para as versões que dão suporte ao TFM atualizado, net6.0-windows.

[10:26:20 INF] Initializing upgrade step Update NuGet Packages
[10:26:20 INF] Initializing upgrade step Duplicate reference analyzer
[10:26:20 INF] No package updates needed
[10:26:20 INF] Initializing upgrade step Package map reference analyzer
[10:26:20 INF] No package updates needed
[10:26:20 INF] Initializing upgrade step Target compatibility reference analyzer
[10:26:20 INF] No package updates needed
[10:26:20 INF] Initializing upgrade step Upgrade assistant reference analyzer
[10:26:20 INF] No package updates needed
[10:26:20 INF] Initializing upgrade step Windows Compatibility Pack Analyzer
[10:26:20 INF] No package updates needed
[10:26:20 INF] Initializing upgrade step MyDotAnalyzer reference analyzer
[10:26:20 INF] No package updates needed
[10:26:20 INF] Initializing upgrade step Newtonsoft.Json reference analyzer
[10:26:20 INF] No package updates needed
[10:26:20 INF] Initializing upgrade step Windows App SDK package analysis
[10:26:20 INF] No package updates needed
[10:26:20 INF] Initializing upgrade step Transitive reference analyzer
[10:26:20 INF] No package updates needed
[10:26:20 INF] Applying upgrade step Update NuGet Packages
[10:26:20 INF] Upgrade step Update NuGet Packages applied successfully

Adicionar arquivos de modelo

Depois que os pacotes são atualizados, a próxima etapa é adicionar os arquivos de modelo. Neste exemplo, não há arquivos de modelo que precisam ser atualizados ou adicionados ao projeto. Esta etapa é ignorada e a próxima etapa é iniciada automaticamente.

[10:26:20 INF] Initializing upgrade step Add template files
[10:26:20 INF] 0 expected template items needed

Atualizar o serviço WCF para o CoreWCF (versão prévia)

Observação: no momento em que essa documentação foi gravada, a extensão do atualizador do WCF é fornecida como uma versão prévia. Se você tiver algum comentário sobre a versão de visualização, abra um problema no repositório Assistente de atualização GitHub com a tag area:WCF.

O assistente de atualização primeiro inicializará a etapa do Atualizador do WCF e verificará se o projeto é aplicável à atualização do WCF.

[10:26:20 INF] Initializing upgrade step Update WCF service to CoreWCF (Preview)
[10:26:20 INF] This config file is applicable for upgrade: C:\Users\Desktop\CalculatorSample\CalculatorService\App.config. System.serviceModel/services elements were found.
[10:26:20 INF] This  file is applicable for upgrade: C:\Users\Desktop\CalculatorSample\CalculatorService\service.cs. ServiceHost object was found.
[10:26:20 INF] This project file is applicable for upgrade: C:\Users\Desktop\CalculatorSample\CalculatorService\CalculatorService.csproj. Reference to System.serviceModel was found.
[10:26:20 INF] This project is applicable for updating to CoreWCF. Initializing the update step...
[10:26:20 INF] Updaters are successfully constructed. Ready to start update.

Choose a command:
   1. Apply next step (Update WCF service to CoreWCF (Preview))
   2. Skip next step (Update WCF service to CoreWCF (Preview))
   3. See more step details
   4. Select different project
   5. Configure logging
   6. Exit

A etapa verifica o arquivo de configuração, o código-fonte e o arquivo de projeto separadamente para decidir se o projeto é aplicável à atualização do WCF. Se o projeto não for aplicável (como não usar o WCF ou não atender aos requisitos declarados no início do artigo), a mensagem de registro em log descreverá qual arquivo não era aplicável e o que estava faltando. Em seguida, a etapa seria ignorada e a próxima etapa seria iniciada automaticamente.

Neste exemplo, CalculatorSample é aplicável para atualização do WCF e escolheremos o comando 1 para aplicar a etapa.

[10:26:23 INF] Applying upgrade step Update WCF service to CoreWCF (Preview)
[10:26:23 INF] Finish updating project file.
[10:26:23 WRN] The mex endpoint is removed from .config file, and service metadata behavior is configured in the source code instead.
[10:26:23 INF] Finish updating configuration files.
[10:26:23 WRN] Changing void Main() to async Task Main() to enable awaiting starting and stopping the ASP.NET Core host.
[10:26:23 INF] Finish updating source code.
[10:26:23 INF] Finish writing changes to project file.
[10:26:23 INF] Finish writing changes to configuration files.
[10:26:23 INF] Finish writing changes to the source code to replace the ServiceHost instance(s).
[10:26:23 INF] Project was successfully updated to use CoreWCF services. Please review changes.
[10:26:23 INF] Upgrade step Update WCF service to CoreWCF (Preview) applied successfully

Esta etapa cria as atualizações e as grava nos arquivos originais individualmente. Preste atenção à saída, que pode notificar sobre a remoção de arquivos originais ou atualizações manuais para concluir após a atualização.

Atualização de arquivos de configuração e código

Essas etapas poderão ser ignoradas automaticamente pela ferramenta se a ferramenta determinar que não há nada a fazer em seu projeto.

Após a conclusão da atualização do WCF, a próxima etapa será atualizar os arquivos de configuração do aplicativo. Neste exemplo, não é necessário atualizar nada nos arquivos de configuração do aplicativo. A etapa do WCF já atualizou os arquivos de configuração para que essa etapa não reclame do uso de system.serviceModel sem suporte. Esta etapa é ignorada e a próxima etapa é iniciada automaticamente.

[10:26:43 INF] Initializing upgrade step Upgrade app config files
[10:26:43 INF] Found 0 app settings for upgrade:
[10:26:43 INF] Found 0 connection strings for upgrade:
[10:26:43 INF] 0 web page namespace imports need upgraded:

A etapa final antes que a atualização deste projeto seja concluída é atualizar todas as referências de código desatualizadas. Com base no tipo de projeto que você está atualizando, uma lista de correções de código conhecidas é exibida para esta etapa. Algumas das correções podem não se aplicar ao projeto.

9. Update source code
    a. Apply fix for UA0002: Types should be upgraded
    b. Apply fix for UA0012: 'UnsafeDeserialize()' does not exist
    c. Apply fix for UA0014: .NET MAUI projects should not reference Xamarin.Forms namespaces
    d. Apply fix for UA0015: .NET MAUI projects should not reference Xamarin.Essentials namespaces

Nesse caso, nenhuma das correções sugeridas se aplica ao projeto de exemplo e essa etapa é concluída automaticamente imediatamente após a conclusão da etapa anterior.

[10:26:44 INF] Initializing upgrade step Update source code
[10:26:44 INF] Running analyzers on CalculatorService
[10:26:48 INF] Identified 0 diagnostics in project CalculatorService
[10:26:51 INF] Initializing upgrade step Move to next project

Como concluir a atualização

Se houver mais projetos a serem migrados, a ferramenta permitirá que você selecione qual projeto será atualizado a seguir. Quando não há mais projetos a serem atualizados, a ferramenta leva você à etapa "Finalizar atualização":

1. [Next step] Finalize upgrade

Choose a command:
   1. Apply next step (Finalize upgrade)
   2. Skip next step (Finalize upgrade)
   3. See more step details
   4. Configure logging
   5. Exit
>
[10:27:15 INF] Applying upgrade step Finalize upgrade
[10:27:15 INF] Upgrade step Finalize upgrade applied successfully

O ideal é que, depois de executar a ferramenta com êxito, essas alterações apareçam nos arquivos originais.

No arquivo service.cs, o using System.ServiceModel foi substituído por referências ao CoreWCF. A instância ServiceHost também foi removida e o serviço foi hospedado em ASP.NET Core.

using System;
using System.Threading.Tasks;
using CoreWCF;
using CoreWCF.Configuration;
using CoreWCF.Description;
using CoreWCF.Security;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
    public static async Task Main()
    {
        var builder = WebApplication.CreateBuilder();

        // Set up port (previously this was done in configuration,
        // but CoreWCF requires it be done in code)
        builder.WebHost.UseNetTcp(8090);
        builder.WebHost.ConfigureKestrel(options =>
        {
            options.ListenAnyIP(8080);
        });

        // Add CoreWCF services to the ASP.NET Core app's DI container
        builder.Services.AddServiceModelServices()
                        .AddServiceModelConfigurationManagerFile("wcf.config")
                        .AddServiceModelMetadata()
                        .AddTransient<CalculatorSample.CalculatorService>();

        var app = builder.Build();

        // Enable getting metadata/wsdl
        var serviceMetadataBehavior = app.Services.GetRequiredService<ServiceMetadataBehavior>();
        serviceMetadataBehavior.HttpGetEnabled = true;
        serviceMetadataBehavior.HttpGetUrl = new Uri("http://localhost:8080/CalculatorSample/metadata");

        // Configure CoreWCF endpoints in the ASP.NET Core hosts
        app.UseServiceModel(serviceBuilder =>
        {
            serviceBuilder.AddService<CalculatorSample.CalculatorService>(serviceOptions => 
            {
                serviceOptions.DebugBehavior.IncludeExceptionDetailInFaults = true;
            });

            serviceBuilder.ConfigureServiceHostBase<CalculatorSample.CalculatorService>(serviceHost =>
            {

            });
        });
            
        await app.StartAsync();
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();
        await app.StopAsync();
    }

Para os arquivos de configuração, a seção system.serviceModel em App.config foi movida para o novo arquivo de configuração wcf.config, que foi gerado durante a atualização.

App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- system.serviceModel section is moved to a separate wcf.config file located at the same directory as this file.-->
</configuration>

wcf.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="CalculatorSample.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">
        <!--The host element is not supported in configuration in CoreWCF. The port that endpoints listen on is instead configured in the source code.-->
        <!--<host>
  <baseAddresses>
    <add baseAddress="net.tcp://localhost:8090/CalculatorSample/service" />
    <add baseAddress="http://localhost:8080/CalculatorSample/service" />
  </baseAddresses>
</host>-->
        <!-- this endpoint is exposed at the base address provided by host: net.tcp://localhost:8090/CalculatorSample/service  -->
        <endpoint address="/CalculatorSample/service" binding="netTcpBinding" contract="CalculatorSample.ICalculator" />
        <!-- the mex endpoint is exposed at http://localhost:8080/CalculatorSample/service/ -->
        <!--The mex endpoint is removed because it's not support in CoreWCF. Instead, the metadata service is enabled in the source code.-->
      </service>
    </services>
    <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
    <!--The behavior element is not supported in configuration in CoreWCF. Some service behaviors, such as metadata, are configured in the source code.-->
    <!--<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <serviceMetadata httpGetEnabled="True" />
      <serviceDebug includeExceptionDetailInFaults="True" />
    </behavior>
  </serviceBehaviors>
</behaviors>-->
  </system.serviceModel>
</configuration>

Por fim, no arquivo de projeto, CalculatorService.csproj, o SDK foi atualizado para Microsoft.NET.Sdk.Web para habilitar o host ASP.NET Core e as referências de pacote CoreWCF foram adicionadas.

  <ItemGroup>
    <PackageReference Include="System.Configuration.ConfigurationManager" Version="5.0.0" />
    <PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.4.336902">
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="CoreWCF.NetTcp" Version="1.1.0" />
    <PackageReference Include="CoreWCF.Primitives" Version="1.1.0" />
    <PackageReference Include="CoreWCF.ConfigurationManager" Version="1.1.0" />
    <PackageReference Include="CoreWCF.Http" Version="1.1.0" />
    <PackageReference Include="CoreWCF.WebHttp" Version="1.1.0" />
  </ItemGroup>

Observe que, na CalculatorSample, não há uma dependência projeto a projeto e o exemplo pode ser executado com êxito depois de atualizar apenas o CalculatorService. Mas em outros casos com dependências diferentes, talvez seja necessário atualizar outros projetos na mesma solução também.

Após a atualização

Depois de atualizar os projetos, você precisará compilá-los e testá-los. O assistente de atualização fará o que puder, mas não poderá resolver todas as incompatibilidades como parte da atualização do projeto. Por exemplo, é possível que a versão .NET Framework de seu aplicativo contenha referências de biblioteca que seu projeto não esteja realmente usando. Você precisará analisar cada referência e determinar se ela é necessária ou não. A ferramenta também pode ter adicionado ou atualizado uma referência de pacote NuGet à versão errada.

Dicas de solução de problemas

Há vários problemas conhecidos que podem ocorrer ao usar o Assistente de Atualização do .NET. Em alguns casos, esses são problemas com a ferramenta try-convert que o Assistente de Atualização do .NET usa internamente.

O repositório de GitHub da ferramenta tem mais dicas de solução de problemas e problemas conhecidos.

Confira também