Condividi tramite


Aggiornare un progetto lato server WCF a CoreWCF

.NET Assistente aggiornamento è uno strumento della riga di comando che consente di aggiornare un progetto lato server WCF esistente in .NET Framework per l’uso dei servizi CoreWCF in .NET 6. Questo articolo include:

  • Informazioni utili per iniziare.
  • Dimostrazione dell’esecuzione dello strumento su un progetto lato server WCF in .NET Framework.
  • Suggerimenti per la risoluzione dei problemi.

Informazioni utili per iniziare

Questo strumento supporta attualmente i progetti C# e usa CoreWCF per trasferire progetti WCF lato server self-hosted in .NET 6.

Importante

L'aggiornamento dei progetti WCF richiede una versione legacy di .NET Upgrade Assistant e non è compatibile con le versioni più recenti. Le istruzioni su come installare la versione legacy sono disponibili nella sezione Installare la versione legacy.

Affinché un progetto WCF sia applicabile per questo aggiornamento, deve soddisfare i requisiti seguenti:

  1. Includere un file .cs che fa riferimento a System.ServiceModel e creare un nuovo ServiceHost.

    Se il progetto WCF dispone di più ServiceHost, tutti gli host devono essere creati nello stesso metodo.

  2. Includere un file .config che archivia le proprietà di System.ServiceModel.

La versione corrente dello strumento non supporta i progetti WCF ospitati tramite file con estensione .svc.

Nota

Se il progetto non è applicabile a questo strumento, è consigliabile consultare la guida di CoreWCF e la demo di esempio di BeanTrader e aggiornare manualmente il progetto.

Prerequisiti

Installare la versione legacy

Usare il comando per installare la dotnet versione 0.4.421302 di Assistente aggiornamento .NET.

dotnet tool install upgrade-assistant -g --version 0.4.421302

Importante

Se sono state configurate origini di feed NuGet aggiuntive, l'installazione potrebbe non riuscire con un errore che indica che il pacchetto NuGet non è disponibile nel feed. Usare il --ignore-failed-sources parametro per considerare tali errori come avvisi anziché errori, ignorando le altre origini feed NuGet:

dotnet tool install upgrade-assistant -g --ignore-failed-sources --version 0.4.421302

Demo-app

È possibile usare il progetto Esempio di calcolatore di base per testare l'aggiornamento con Assistente aggiornamento, che è anche la demo usata in questa documentazione.

Per provare un esempio più complesso, vedere l'esempio di BeanTradercreato da Mike Rousos.

Eseguire l’assistente aggiornamento

Aprire un terminale e passare alla cartella in cui si trova il progetto o la soluzione di destinazione. Eseguire il comando upgrade-assistant upgrade, inserendo il nome del progetto o della soluzione da aggiornare.

Quando viene fornito un progetto, il processo di aggiornamento viene avviato immediatamente su tale progetto. Se viene fornita una soluzione, si selezionerà il progetto che si esegue normalmente, noto come punto di ingresso dell'aggiornamento. In base a tale progetto, viene creato un grafico delle dipendenze e viene fornito un suggerimento sull'ordine di aggiornamento dei progetti.

upgrade-assistant upgrade .\CalculatorSample.sln

Lo strumento viene eseguito e mostra un elenco dei passaggi che eseguirà. Al termine di ogni passaggio, lo strumento fornisce una set di comandi che consentono all'utente di applicare o ignorare il passaggio successivo o qualche altra opzione, come ad esempio:

  • Ottenere altre informazioni sul passaggio.
  • Modificare i progetti.
  • Regolare le impostazioni di registrazione.
  • Arrestare l'aggiornamento e uscire.

Premendo INVIO senza scegliere un numero, viene selezionata la prima voce dell'elenco.

Durante l'inizializzazione, ogni passaggio può fornire informazioni su ciò che pensa accadrà se si applica tale passaggio.

Selezionare il punto di ingresso e il progetto da aggiornare

Il primo passaggio per l'aggiornamento dell'Esempio di calcolatrice di base è la scelta del progetto che funge da punto di ingresso nella soluzione.

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

Scegliere il comando 1 per avviare tale passaggio. I risultati vengono visualizzati:

[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

Sono elencati due progetti. Poiché lo strumento aggiorna il progetto lato server, si sceglierà il comando 2 per selezionare il progetto di servizio come punto di ingresso.

Aggiornare il progetto

Dopo aver selezionato un progetto, viene fornito un elenco dei passaggi di aggiornamento che verranno eseguiti dallo strumento.

Importante

In base al progetto da aggiornare, è possibile che in questo esempio vengano visualizzati o meno tutti i passaggi elencati.

L'output seguente descrive i passaggi necessari per aggiornare il progetto:

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

Nota

Nel resto di questo articolo, i passaggi di aggiornamento non vengono visualizzati in modo esplicito, a meno che non vi sia qualcosa di importante da chiamare. I risultati di ogni passaggio vengono comunque visualizzati.

Creare un backup

In questo esempio di aggiornamento del progetto CalculatorService si applicherà ogni passaggio. Il primo passaggio, comando 1, esegue il backup del progetto:

[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

Lo strumento sceglie un percorso di backup predefinito denominato in base alla cartella corrente, ma con .backup accodato ad essa. È possibile scegliere un percorso personalizzato in alternativa a quello predefinito. Per ogni progetto aggiornato, la cartella del progetto viene copiata nella cartella di backup. In questo esempio la cartella CalculatorService viene copiata da CalculatorSample\CalculatorService a CalculatorSample.backup\CalculatorService durante il passaggio di backup:

[10:25:53 INF] Backing up C:\Users\Desktop\CalculatorSample\CalculatorService to C:\Users\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...

Aggiornare il file di progetto

Il progetto viene aggiornato dal formato .NET Framework al formato .NET SDK.

[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

Prestare attenzione all'output di ogni passaggio. Si noti che l'output dell'esempio indica che si dovrà completare un passaggio manuale dopo l'aggiornamento:

App.config viene sostituito da appsettings.json in .NET Core. Sarà necessario eliminare App.config ed eseguire la migrazione a appsettings.json se è applicabile al progetto.

In questo esempio, il passaggio di aggiornamento WCF creerà un nuovo wcf.config in base alla sezione system.serviceModel in App.config. Non sarà necessario eseguire la migrazione a appsettings.json.

Pulire i riferimenti NuGet

Dopo aver aggiornato il formato del progetto, il passaggio successivo consiste nel pulire i riferimenti al pacchetto NuGet.

Oltre ai pacchetti a cui fa riferimento l'app, il file packages.config contiene i riferimenti alle dipendenze di tali pacchetti. Ad esempio, se si aggiunge un riferimento al pacchetto A che dipende dal pacchetto B, entrambi i pacchetti verranno referenziati nel file packages.config. Nel nuovo sistema di progetto, è necessario solo il riferimento al pacchetto A. Questo passaggio analizza i riferimenti al pacchetto e rimuove quelli non necessari.

[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

L'app fa ancora riferimento agli assembly .NET Framework. Alcuni di questi assembly possono essere disponibili come pacchetti NuGet. Questo passaggio analizza gli assembly e fa riferimento al pacchetto NuGet appropriato.

IIn questo esempio, il programma di aggiornamento dei pacchetti rileva CalculatorService come progetto solo server e non è necessario aggiungere pacchetti System.ServiceModel. Anche se sono stati aggiunti all'elenco in base alla configurazione del mapping dei pacchetti, questi passaggi non sono stati applicati.

Gestire il TFM

Lo strumento modifica quindi il TFM da .NET Framework all'SDK suggerito. In questo esempio è 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

Aggiornare i pacchetti NuGet

Successivamente, lo strumento aggiorna i pacchetti NuGet del progetto alle versioni che supportano il TFM aggiornato, 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

Aggiungere file modello

Dopo aver aggiornato i pacchetti, il passaggio successivo consiste nell'aggiornare tutti i file modello. In questo esempio non sono presenti file modello che devono essere aggiornati o aggiunti al progetto. Questo passaggio viene ignorato e il passaggio successivo viene avviato automaticamente.

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

Aggiornare il servizio WCF a CoreWCF (anteprima)

Nota: al momento della scrittura di questa documentazione, l'estensione del programma di aggiornamento WCF viene fornita come versione di anteprima. Se si hanno commenti e suggerimenti per la versione di anteprima, aprire un problema nel repository GitHub di Assistente aggiornamento con tag area:WCF.

Per prima cosa, l'assistente all'aggiornamento inizializzerà il passaggio WCF Updater e verificherà se il progetto è applicabile per l’aggiornamento 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

Il passaggio controlla separatamente il file di configurazione, il codice sorgente e il file di progetto per decidere se il progetto è applicabile per l'aggiornamento WCF. Se il progetto non è applicabile (ad esempio, se non si usa WCF o non si soddisfano i requisiti indicati all'inizio dell'articolo), il messaggio di registrazione descriverà quale file non è applicabile e quali sono gli elementi mancanti. Il passaggio verrà quindi ignorato e il passaggio successivo verrà avviato automaticamente.

In questo esempio, CalculatorSample è applicabile per l'aggiornamento WCF e si sceglierà il comando 1 per applicare il passaggio.

[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

Questo passaggio crea gli aggiornamenti e li scrive singolarmente nei file originali. Prestare attenzione all'output, in quanto potrebbe notificare la rimozione dai file originali o gli aggiornamenti manuali da completare dopo l'aggiornamento.

Aggiornamento dei file di configurazione e di codice

Questi passaggi possono essere ignorati automaticamente dallo strumento se questo determina che non vi è nulla da fare per il progetto.

Al termine dell'aggiornamento WCF, il passaggio successivo consiste nell'aggiornare i file di configurazione dell'app. In questo esempio, non è necessario aggiornare nulla nei file di configurazione dell'app. Il passaggio WCF ha già aggiornato i file di configurazione in modo che questo passaggio non richieda l’uso di system.serviceModel non supportati. Questo passaggio viene ignorato e il passaggio successivo viene avviato 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:

Il passaggio finale prima del completamento dell'aggiornamento di questo progetto consiste nell'aggiornare tutti i riferimenti al codice obsoleti. In base al tipo di progetto che si sta aggiornando, per questo passaggio viene visualizzato un elenco di correzioni del codice note. Alcune delle correzioni potrebbero non essere applicabili al progetto.

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

In questo caso, nessuna delle correzioni suggerite si applica al progetto di esempio e questo passaggio si conclude automaticamente, subito dopo il completamento del passaggio precedente.

[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

Completamento dell'aggiornamento

Se sono presenti altri progetti di cui eseguire la migrazione, lo strumento consente di selezionare il progetto da aggiornare successivamente. Quando non sono più disponibili progetti da aggiornare, lo strumento consente di passare al passaggio "Finalizza aggiornamento":

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

Idealmente, dopo aver eseguito correttamente lo strumento, queste modifiche dovrebbero essere visualizzate nei file originali.

Nel file service.cs l'using System.ServiceModel è stato sostituito con riferimenti a CoreWCF. Anche l'istanza ServiceHost è stata rimossa e il servizio è stato ospitato su 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();
    }

Per i file di configurazione, la sezione system.serviceModel in App.config è stata spostata nel nuovo file di configurazione wcf.config, che è stato generato durante l'aggiornamento.

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>

Infine, nel file di progetto, CalculatorService.csproj, l'SDK è stato aggiornato a Microsoft.NET.Sdk.Web per abilitare l'host ASP.NET Core e sono stati aggiunti i riferimenti al pacchetto CoreWCF.

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

Si noti che in CalculatorSample non esiste una dipendenza da progetto a progetto e che l'esempio può essere eseguito correttamente dopo aver aggiornato solo CalculatorService. Tuttavia, in altri casi con dipendenze diverse, potrebbe essere necessario aggiornare anche altri progetti nella stessa soluzione.

Dopo l'aggiornamento

Dopo aver aggiornato i progetti, è necessario compilarli e testarli. L'assistente di aggiornamento farà il possibile, ma non può risolvere ogni incompatibilità nell'ambito dell'aggiornamento del progetto. Ad esempio, è possibile che la versione .NET Framework dell'app contenga riferimenti a librerie che il progetto non sta effettivamente usando. È necessario analizzare ogni riferimento e determinare se è necessario o meno. Lo strumento potrebbe anche aver aggiunto o aggiornato un riferimento di pacchetto NuGet a una versione errata.

Suggerimenti per la risoluzione dei problemi

Quando si usa .NET Upgrade Assistant, possono verificarsi diversi problemi noti. In alcuni casi, questi problemi riguardano lo strumento try-convert usato internamente da .NET Assistente aggiornamento.

Il repository GitHub dello strumento include altri suggerimenti per la risoluzione dei problemi e problemi noti.

Vedi anche