Freigeben über


Upgrade eines WCF Server-side-Projekts auf CoreWCF

Der .NET-Upgrade-Assistent ist ein Befehlszeilentool, mit dem Sie ein vorhandenes serverseitiges WCF-Projekt im .NET Framework upgraden können, um CoreWCF-Dienste in .NET 6 zu verwenden. Dieser Artikel enthält Folgendes:

  • Wichtige Informationen vor dem Start
  • Demonstration zum Ausführen des Tools für ein serverseitiges WCF-Projekt im .NET Framework
  • Hinweise zur Problembehandlung.

Wichtige Informationen vor dem Start

Dieses Tool unterstützt derzeit C#-Projekte und verwendet CoreWCF zum Portieren von selbstgehosteten serverseitigen WCF-Projekten zu .NET 6.

Wichtig

Für das Upgrade von WCF-Projekten ist eine ältere Version des .NET-Upgrade-Assistenten erforderlich und nicht mit den neuesten Versionen kompatibel. Anweisungen zum Installieren der Legacyversion finden Sie im Abschnitt "Installieren der Legacyversion ".

Damit ein WCF-Projekt für dieses Upgrade anwendbar ist, muss es die folgenden Anforderungen erfüllen:

  1. Es muss eine CS-Datei enthalten, die auf System.ServiceModel verweist und einen neuen ServiceHost erstellt.

    Wenn das WCF-Projekt über mehrere ServiceHost-Elemente verfügt, müssen alle Hosts mit derselben Methode erstellt werden.

  2. Es muss eine CONFIG-Datei enthalten sein, die System.ServiceModel-Eigenschaften speichert.

Die aktuelle Version des Tools unterstützt keine WCF-Projekte, die über SVC-Dateien gehostet werden.

Hinweis

Wenn Ihr Projekt für dieses Tool nicht anwendbar ist, wird empfohlen, sich den CoreWCF-Leitfaden mit exemplarischer Vorgehensweise und die BeanTrader-Beispieldemo anzusehen und das Projekt manuell upzudaten.

Voraussetzungen

Installieren der Legacyversion

Verwenden Sie den dotnet Befehl, um die Version 0.4.421302 des .NET-Upgrade-Assistenten zu installieren.

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

Wichtig

Wenn Sie zusätzliche NuGet-Feedquellen konfiguriert haben, schlägt die Installation möglicherweise mit einem Fehler fehl, der angibt, dass das NuGet-Paket nicht im Feed verfügbar ist. Verwenden Sie den --ignore-failed-sources Parameter, um diese Fehler anstelle von Fehlern als Warnungen zu behandeln und die anderen NuGet-Feedquellen zu umgehen:

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

Demo-App

Sie können das Basic Calculator Sample-Projekt verwenden, um das Upgraden mit dem Upgrade-Assistenten zu testen, was der in dieser Dokumentation verwendeten Demo entspricht.

Wenn Sie ein komplizierteres Beispiel ausprobieren möchten, sehen Sie sich das von Mike Rousos erstellte BeanTrader-Beispiel an.

Ausführen des Upgrade-Assistenten

Öffnen Sie ein Terminal, und navigieren Sie zu dem Ordner, in dem sich das Zielprojekt oder die Projektmappe befindet. Führen Sie den Befehl upgrade-assistant upgrade aus, und übergeben Sie den Namen des zu aktualisierenden Projekts oder der Projektmappe.

Wenn ein Projekt bereitgestellt wird, beginnt der Upgradeprozess sofort mit diesem Projekt. Wenn eine Projektmappe bereitgestellt wird, wählen Sie aus, welches Projekt Sie normalerweise ausführen (wird als Upgradeeinstiegspunkt bezeichnet). Basierend auf diesem Projekt wird ein Abhängigkeitsdiagramm erstellt und ein Vorschlag für die Reihenfolge gemacht, in der Sie die Projekte upgraden sollten.

upgrade-assistant upgrade .\CalculatorSample.sln

Das Tool wird ausgeführt, und Ihnen wird eine Liste der Schritte angezeigt, die ausgeführt werden. Sobald jeder Schritt abgeschlossen ist, stellt das Tool eine Reihe von Befehlen bereit, mit denen Benutzer*innen den nächsten Schritt oder eine andere Option anwenden oder überspringen können. Beispiele:

  • Abrufen weiterer Informationen zum Schritt
  • Ändern von Projekten
  • Anpassen der Protokollierungseinstellungen
  • Abbrechen des Upgrades und Beenden

Wenn Sie die EINGABETASTE drücken, ohne eine Zahl auszuwählen, wird das erste Element in der Liste ausgewählt.

Da jeder Schritt initialisiert wird, können Informationen dazu angezeigt werden, was bei der Durchführung des Schritts passieren kann.

Auswählen des Einstiegspunkts und des Projekts, das upgegradet werden soll

Der erste Schritt beim Upgrade des Basic Calculator Sample besteht darin, auszuwählen, welches Projekt in der Projektmappe als Einstiegspunktprojekt dient.

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

Wählen Sie command 1 aus, um diesen Schritt zu starten. Die Ergebnisse werden angezeigt:

[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

Es sind zwei Projekte aufgeführt. Da das Tool das serverseitige Projekt upgradet, wählen Sie command 2 aus, um das Dienstprojekt als Einstiegspunkt auszuwählen.

Upgraden des Projekts

Sobald ein Projekt ausgewählt ist, wird eine Liste der Upgradeschritte aufgelistet, die das Tool ausführt.

Wichtig

Basierend auf dem Projekt, für das Sie ein Upgrade durchführen, werden möglicherweise alle in diesem Beispiel aufgeführten Schritte angezeigt.

In der folgenden Ausgabe werden die Schritte beschrieben, die beim Upgrade für das Projekts erforderlich sind:

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

Hinweis

Für den Rest dieses Artikels werden die Upgradeschritte nicht explizit angezeigt, es sei denn, es ist etwas Wichtiges zu nennen. Die Ergebnisse der einzelnen Schritte werden weiterhin angezeigt.

So erstellen Sie eine Sicherung

In diesem Beispiel für das Upgrade des CalculatorService-Projekts wenden Sie jeden Schritt an. Mit dem ersten Schritt (command 1) wird das Projekt gesichert:

[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

Das Tool wählt einen Standardsicherungspfad aus, der nach dem aktuellen Ordner benannt ist, jedoch mit dem Zusatz .backup. Sie können einen benutzerdefinierten Pfad als Alternative zum Standardpfad auswählen. Für jedes upgegradete Projekt wird der Ordner des Projekts in den Sicherungsordner kopiert. In diesem Beispiel wird der Ordner CalculatorService im Sicherungsschritt aus CalculatorSample\CalculatorService in CalculatorSample.backup\CalculatorService kopiert:

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

Upgraden der Projektdatei

Das Projekt wird vom .NET Framework-Projektformat auf das .NET SDK-Projektformat upgegradet.

[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

Achten Sie auf die Ausgabe jedes Schritts. Beachten Sie, dass die Beispielausgabe angibt, dass Sie nach dem Upgrade einen manuellen Schritt ausführen müssen:

„App.config“ wird durch „appsettings.json“ in .NET Core ersetzt. Sie müssen „App.config“ löschen und zu „appsettings.json“ migrieren, wenn dies für Ihr Projekt geeignet ist.

In diesem Beispiel wird beim WCF-Updateschritt eine neue wcf.config-Datei basierend auf dem system.serviceModel-Abschnitt in App.config erstellt. Es ist keine Migration zu „appsettings.json“ erforderlich.

Bereinigen von NuGet-Verweisen

Nachdem das Projektformat upgedatet wurde, besteht der nächste Schritt darin, die NuGet-Paketverweise zu bereinigen.

Zusätzlich zu den Paketen, auf die Ihre App verweist, enthält die Datei packages.config Verweise auf die Abhängigkeiten dieser Pakete. Wenn Sie beispielsweise einen Verweis auf das Paket A hinzugefügt haben, das vom Paket B abhängt, wird in der Datei packages.config auf beide Pakete verwiesen. Im neuen Projektsystem ist nur der Verweis auf das Paket A erforderlich. In diesem Schritt werden die Paketverweise analysiert und diejenigen entfernt, die nicht erforderlich sind.

[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

Ihre App verweist weiterhin auf .NET Framework-Assemblys. Einige dieser Assemblys sind möglicherweise als NuGet-Pakete verfügbar. In diesem Schritt werden diese Assemblys analysiert und auf das entsprechende NuGet-Paket verwiesen.

In diesem Beispiel erkennt der Paketupdater den CalculatorService als rein serverbasiertes Projekt, und es ist nicht erforderlich, System.ServiceModel-Pakete hinzuzufügen. Obwohl sie der Liste basierend auf der Paketzuordnungskonfiguration hinzugefügt wurden, wurden diese Schritte nicht angewendet.

Verwendung des TFM

Als Nächstes ändert das Tool den Zielframeworkmoniker (TFM) des .NET Framework in das vorgeschlagene SDK. In diesem Beispiel lautet er 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

Aktualisieren von NuGet-Paketen

Danach updatet das Tool die NuGet-Pakete auf die Versionen, die den aktualisierten TFM (net6.0-windows) unterstützen.

[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

Hinzufügen von Vorlagendateien

Nachdem die Pakete upgedatet sind, besteht der nächste Schritt darin, alle Vorlagendateien upzudaten. In diesem Beispiel sind keine Vorlagendateien vorhanden, die upgedatet oder dem Projekt hinzugefügt werden müssen. Dieser Schritt wird übersprungen, und der nächste Schritt wird automatisch gestartet.

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

Update des WCF-Diensts auf CoreWCF (Vorschau)

Hinweis: Zum Zeitpunkt der Erstellung dieser Dokumentation wird die WCF-Updateerweiterung als Vorschauversion bereitgestellt. Wenn Sie Feedback zur Vorschauversion übermitteln möchten, öffnen Sie ein Issue im GitHub-Repository zum Upgrade-Assistenten mit dem area:WCF-Tag.

Der Upgrade-Assistent initialisiert zuerst den WCF-Updaterschritt und überprüft, ob das Projekt für WCF-Updates anwendbar ist.

[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

Mit dem Schritt wird die Konfigurationsdatei, Quellcode und die Projektdatei separat überprüft, um zu entscheiden, ob das Projekt für das WCF-Update geeignet ist. Wenn das Projekt nicht anwendbar ist (beispielsweise wenn nicht die WCF verwendet wird oder die am Anfang des Artikels angegebenen Anforderungen nicht erfüllt werden), wird in der Protokollierungsmeldung beschrieben, welche Datei nicht anwendbar ist und was fehlt. Anschließend wird der Schritt übersprungen und der nächste Schritt automatisch gestartet.

In diesem Beispiel ist CalculatorSample für das WCF-Update anwendbar, und Sie wählen command 1 aus, um den Schritt anzuwenden.

[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

In diesem Schritt werden die Updates erstellt und einzeln in die ursprünglichen Dateien geschrieben. Achten Sie auf die Ausgabe, die Sie über die Entfernung aus ursprünglichen Dateien oder über manuelle Updates benachrichtigen kann, die nach dem Upgrade abgeschlossen werden sollen.

Updaten von Konfigurations- und Codedateien

Diese Schritte werden möglicherweise automatisch vom Tool übersprungen, wenn das Tool feststellt, dass für Ihr Projekt diesbezüglich nichts zu tun ist.

Nachdem das WCF-Update abgeschlossen ist, besteht der nächste Schritt darin, App-Konfigurationsdateien upzudaten. In diesem Beispiel ist in den App-Konfigurationsdateien kein Upgrade erforderlich. Der WCF-Schritt hat die Konfigurationsdateien bereits upgedatet, sodass die Verwendung des nicht unterstützten system.serviceModel kein Problem darstellt. Dieser Schritt wird übersprungen, und der nächste Schritt wird automatisch gestartet.

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

Der letzte Schritt vor Abschluss des Upgrades dieses Projekts besteht darin, alle veralteten Codeverweise upzudaten. Basierend auf dem Typ des Projekts, für das Sie ein Upgrade durchführen, wird eine Liste bekannter Codefixes für diesen Schritt angezeigt. Einige der Fixes gelten möglicherweise nicht für Ihr Projekt.

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 diesem Fall gelten keine der vorgeschlagenen Fixes für das Beispielprojekt, und dieser Schritt wird automatisch unmittelbar nach Abschluss des vorherigen Schritts abgeschlossen.

[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

Abschließen des Upgrades

Wenn weitere Projekte migriert werden sollen, können Sie mit dem Tool auswählen, welches Projekt als Nächstes upgegradet werden soll. Wenn es keine weiteren Projekte gibt, die upgegradet werden sollen, wird der Schritt „Upgrade abschließen“ angezeigt:

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

Im Idealfall sollten diese Änderungen nach dem erfolgreichen Ausführen des Tools in den ursprünglichen Dateien angezeigt werden.

In der service.cs-Datei wurde using System.ServiceModel durch Verweise auf CoreWCF ersetzt. Die ServiceHost-Instanz wurde ebenfalls entfernt, und der Dienst wurde auf ASP.NET Core gehostet.

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

Für die Konfigurationsdateien wurde der Abschnitt system.serviceModel in App.config in die neue Konfigurationsdatei wcf.config verschoben, die während des Updates generiert wurde.

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>

Schließlich wurde das SDK in der Projektdatei CalculatorService.csproj auf Microsoft.NET.Sdk.Web upgedatet, um ASP.NET Core-Hosts zu ermöglichen, und CoreWCF-Paketverweise wurden hinzugefügt.

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

Beachten Sie dass im CalculatorSample keine Projekt-zu-Projekt-Abhängigkeit besteht und das Beispiel erfolgreich ausgeführt werden kann, nachdem nur der CalculatorService aktualisiert wurde. In anderen Fällen mit unterschiedlichen Abhängigkeiten müssen Sie möglicherweise auch andere Projekte in derselben Projektmappe updaten.

Nach dem Upgrade

Nachdem Sie Ihre Projekt upgegradet haben, müssen Sie sie kompilieren und testen. Der Upgrade-Assistent führt zwar alle möglichen Schritte aus, allerdings kann er nicht jede Inkompatibilität im Rahmen des Projektupgrades beheben. Es ist beispielsweise möglich, dass die .NET Framework-Version Ihrer App Bibliotheksverweise enthält, die Ihr Projekt tatsächlich nicht verwendet. Sie müssen jeden Verweis analysieren und bestimmen, ob er erforderlich ist. Das Tool hat möglicherweise auch eine falsche Version hinzugefügt oder einen NuGet-Paketverweis auf eine falsche Version upgegradet.

Tipps zur Problembehandlung

Es gibt mehrere bekannte Probleme, die bei der Verwendung des .NET-Upgrade-Assistenten auftreten können. In einigen Fällen treten Probleme mit dem Tool „try-convert“ auf, das vom .NET-Upgrade-Assistenten intern verwendet wird.

Im GitHub-Repository des Tools sind weitere Tipps zur Problembehandlung und bekannte Probleme zu finden.

Siehe auch