Udostępnij za pośrednictwem


Uaktualnianie projektu po stronie serwera WCF w celu korzystania z programu CoreWCF na platformie .NET 6

Ważne

Ten artykuł został napisany przed wydaniem rozszerzenia Asystenta uaktualniania dla programu Visual Studio i korzysta ze starszego narzędzia interfejsu wiersza polecenia. Aby uzyskać więcej informacji, zobacz Use the legacy .NET Upgrade Assistant (Korzystanie ze starszego asystenta uaktualniania platformy .NET).

Asystent uaktualniania platformy .NET to narzędzie wiersza polecenia, które może pomóc w uaktualnieniu istniejącego projektu po stronie serwera WCF na platformie .NET Framework do korzystania z usług CoreWCF na platformie .NET 6. Ten artykuł zawiera:

  • Rzeczy, które należy wiedzieć przed rozpoczęciem.
  • Pokaz sposobu uruchamiania narzędzia względem projektu po stronie serwera WCF na platformie .NET Framework.
  • Porady dotyczące rozwiązywania problemów.

Aby uzyskać więcej informacji na temat sposobu instalowania narzędzia, zobacz Use the legacy .NET Upgrade Assistant (Korzystanie ze starszego asystenta uaktualniania platformy .NET).

Co należy wiedzieć przed rozpoczęciem

To narzędzie obsługuje obecnie projekty języka C# i używa programu CoreWCF do przenoszenia własnych projektów po stronie serwera WCF do platformy .NET 6.

Aby projekt WCF mógł mieć zastosowanie do tego uaktualnienia, musi spełniać następujące wymagania:

  1. Zawiera plik .cs, który odwołuje się System.ServiceModel i tworzy nowy ServiceHost.

    Jeśli projekt WCF ma wiele ServiceHosthostów, należy utworzyć wszystkie hosty w tej samej metodzie.

  2. Zawiera plik config, który przechowuje System.ServiceModel właściwości.

Bieżąca wersja narzędzia nie obsługuje projektów WCF hostowanych za pośrednictwem plików svc.

Uwaga

Jeśli projekt nie ma zastosowania do tego narzędzia, zalecamy zapoznanie się z przewodnikiem dotyczącym technologii CoreWCF i pokazem przykładu BeanWorks i ręcznej aktualizacji projektu.

Pokazowa aplikacja

Możesz użyć projektu Basic Calculator Sample , aby przetestować uaktualnianie za pomocą Asystenta uaktualniania, który jest również pokazem używanym w tej dokumentacji.

Jeśli chcesz wypróbować bardziej skomplikowany przykład, zobacz przykład BeanWorks utworzony przez Mike'a Rousosa.

Uruchamianie asystenta uaktualnienia

Otwórz terminal i przejdź do folderu, w którym znajduje się docelowy projekt lub rozwiązanie. upgrade-assistant upgrade Uruchom polecenie, przekazując nazwę projektu lub rozwiązania, które uaktualniasz.

Po udostępnieniu projektu proces uaktualniania rozpoczyna się od razu w tym projekcie. Jeśli zostanie podane rozwiązanie, wybierzesz, który projekt jest zwykle uruchamiany, znany jako punkt wejścia uaktualnienia. Na podstawie tego projektu tworzony jest graf zależności i sugestia, w jakiej kolejności należy uaktualnić projekty.

upgrade-assistant upgrade .\CalculatorSample.sln

Narzędzie zostanie uruchomione i wyświetli listę kroków, które wykona. Po zakończeniu każdego kroku narzędzie udostępnia zestaw poleceń, które umożliwiają użytkownikowi zastosowanie lub pominięcie następnego kroku lub innej opcji, takiej jak:

  • Uzyskaj więcej informacji na temat kroku.
  • Zmień projekty.
  • Dostosuj ustawienia rejestrowania.
  • Zatrzymaj uaktualnianie i zakończ pracę.

Naciśnięcie klawisza Enter bez wybierania liczby powoduje wybranie pierwszego elementu na liście.

Podczas inicjowania poszczególnych kroków może on dostarczyć informacje o tym, co uważa, że będzie się zdarzyć, jeśli zastosujesz krok.

Wybierz punkt wejścia i projekt do uaktualnienia

Pierwszym krokiem uaktualniania przykładu podstawowego kalkulatora jest wybranie projektu w rozwiązaniu jako projektu punktu wejścia.

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

Wybierz polecenie 1 , aby rozpocząć ten krok. Zostaną wyświetlone wyniki:

[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

Istnieją dwa projekty na liście. Ponieważ nasze narzędzie uaktualnia projekt po stronie serwera, wybierzemy polecenie 2 , aby wybrać projekt usługi jako punkt wejścia.

Uaktualnianie projektu

Po wybraniu projektu zostanie wyświetlona lista kroków uaktualniania, które zostanie zastosowane przez narzędzie.

Ważne

Na podstawie projektu, który uaktualniasz, możesz lub nie widzisz każdego kroku wymienionego w tym przykładzie.

W poniższych danych wyjściowych opisano kroki związane z uaktualnianiem projektu:

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

Uwaga

W pozostałej części tego artykułu kroki uaktualniania nie są jawnie wyświetlane, chyba że istnieje coś ważnego do wywołania. Wyniki każdego kroku są nadal wyświetlane.

Tworzenie kopii zapasowej

W tym przykładzie uaktualniania projektu CalculatorService zastosujesz każdy krok. Pierwszym krokiem polecenia 1 jest tworzenie kopii zapasowej projektu:

[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

Narzędzie wybiera domyślną ścieżkę kopii zapasowej o nazwie po bieżącym folderze, ale z dołączonym .backup do niego. Możesz wybrać ścieżkę niestandardową jako alternatywę dla ścieżki domyślnej. Dla każdego uaktualnionego projektu folder projektu jest kopiowany do folderu kopii zapasowej. W tym przykładzie CalculatorService folder jest kopiowany z pliku CalculatorSample\CalculatorService do pliku CalculatorSample.backup\CalculatorService podczas wykonywania kroku tworzenia kopii zapasowej:

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

Uaktualnianie pliku projektu

Projekt jest uaktualniany z formatu projektu .NET Framework do formatu projektu .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

Zwróć uwagę na dane wyjściowe każdego kroku. Zwróć uwagę, że przykładowe dane wyjściowe wskazują, że po uaktualnieniu wykonasz krok ręczny:

Plik App.config jest zastępowany przez appsettings.json na platformie .NET Core. Musisz usunąć plik App.config i przeprowadzić migrację do appsettings.json, jeśli ma zastosowanie do projektu.

W tym przykładzie krok aktualizacji programu WCF utworzy nowy plik wcf.config na system.serviceModel podstawie sekcji w pliku App.config. Nie będziemy musieli migrować do appsettings.json.

Czyszczenie odwołań NuGet

Po zaktualizowaniu formatu projektu następnym krokiem jest wyczyszczenie odwołań do pakietu NuGet.

Oprócz pakietów, do których odwołuje się aplikacja, plik packages.config zawiera odwołania do zależności tych pakietów. Jeśli na przykład dodano odwołanie do pakietu A, który zależy od pakietu B, oba pakiety będą odwoływały się do pliku packages.config. W nowym systemie projektu wymagane jest tylko odwołanie do pakietu A . Ten krok analizuje odwołania do pakietu i usuwa te, które nie są wymagane.

[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

Aplikacja nadal odwołuje się do zestawów .NET Framework. Niektóre z tych zestawów mogą być dostępne jako pakiety NuGet. Ten krok analizuje te zestawy i odwołuje się do odpowiedniego pakietu NuGet.

W tym przykładzie aktualizator pakietów wykrywa aplikację CalculatorService jako projekt tylko dla serwera i nie ma potrzeby dodawania System.ServiceModel pakietów. Mimo że zostały one dodane do listy na podstawie konfiguracji mapowania pakietów, te kroki nie zostały zastosowane.

Obsługa programu TFM

Następnie narzędzie zmienia program TFM z programu .NET Framework na sugerowany zestaw SDK. W tym przykładzie jest to 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

Uaktualnianie pakietów NuGet

Następnie narzędzie aktualizuje pakiety NuGet projektu do wersji, które obsługują zaktualizowany program TFM, 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

Dodawanie plików szablonów

Po zaktualizowaniu pakietów następnym krokiem jest zaktualizowanie wszystkich plików szablonów. W tym przykładzie nie ma plików szablonów, które należy zaktualizować ani dodać do projektu. Ten krok zostanie pominięty, a następny krok zostanie uruchomiony automatycznie.

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

Aktualizowanie usługi WCF do platformy CoreWCF (wersja zapoznawcza)

Uwaga: w momencie pisania tej dokumentacji rozszerzenie aktualizatora WCF jest dostarczane jako wersja zapoznawcza. Jeśli masz jakiekolwiek opinie dotyczące wersji zapoznawczej, otwórz problem w repozytorium GitHub Asystenta uaktualniania z tagiem area:WCF .

Asystent uaktualniania najpierw zainicjuje krok aktualizatora WCF i sprawdzi, czy projekt ma zastosowanie do aktualizacji programu 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

Krok sprawdza plik konfiguracji, kod źródłowy i plik projektu oddzielnie, aby zdecydować, czy projekt ma zastosowanie do aktualizacji programu WCF. Jeśli projekt nie ma zastosowania (na przykład nie korzysta z usługi WCF lub nie spełnia wymagań określonych na początku artykułu), komunikat rejestrowania opisuje, który plik nie ma zastosowania i czego brakuje. Następnie krok zostanie pominięty, a następny krok zostanie uruchomiony automatycznie.

W tym przykładzie aplikacja CalculatorSample ma zastosowanie do aktualizacji programu WCF i wybierzemy polecenie 1 , aby zastosować krok.

[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

Ten krok tworzy aktualizacje i zapisuje je indywidualnie w oryginalnych plikach. Zwróć uwagę na dane wyjściowe, które mogą powiadomić o usunięciu oryginalnych plików lub ręcznych aktualizacji do ukończenia po uaktualnieniu.

Aktualizacja plików konfiguracji i kodu

Te kroki mogą zostać pominięte automatycznie przez narzędzie, jeśli narzędzie ustali, że nie ma nic do zrobienia dla projektu.

Po zakończeniu aktualizacji programu WCF następnym krokiem jest zaktualizowanie plików konfiguracji aplikacji. W tym przykładzie nie trzeba uaktualniać żadnych elementów w plikach konfiguracji aplikacji. Krok programu WCF zaktualizował już pliki konfiguracji, więc ten krok nie będzie narzekać na użycie nieobsługiwanego system.serviceModelelementu . Ten krok zostanie pominięty, a następny krok zostanie uruchomiony automatycznie.

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

Ostatnim krokiem przed ukończeniem uaktualnienia tego projektu jest zaktualizowanie wszelkich nieaktualnych odwołań do kodu. Na podstawie typu projektu, który uaktualniasz, zostanie wyświetlona lista znanych poprawek kodu dla tego kroku. Niektóre poprawki mogą nie mieć zastosowania do projektu.

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

W takim przypadku żaden z sugerowanych poprawek nie ma zastosowania do przykładowego projektu, a ten krok zostanie automatycznie ukończony natychmiast po zakończeniu poprzedniego kroku.

[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

Kończenie uaktualniania

Jeśli masz więcej projektów do zmigrowania, narzędzie umożliwia wybranie projektu do uaktualnienia następnego. Jeśli nie ma już projektów do uaktualnienia, narzędzie przeprowadzi Cię do kroku "Finalizowanie uaktualnienia":

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

W idealnym przypadku po pomyślnym uruchomieniu narzędzia te zmiany powinny pojawić się w oryginalnych plikach.

W service.cs pliku element using System.ServiceModel został zastąpiony odwołaniami do coreWCF. Wystąpienie ServiceHost zostało również usunięte, a usługa była hostowana na platformie 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();
    }

W przypadku plików system.serviceModel konfiguracji sekcja w pliku App.config została przeniesiona do nowego pliku wcf.configkonfiguracji, który został wygenerowany podczas aktualizacji.

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>

Na koniec w pliku CalculatorService.csprojprojektu zestaw SDK został zaktualizowany w celu Microsoft.NET.Sdk.Web włączenia ASP.NET Core hostów i odwołań do pakietu 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>

Zwróć uwagę, że w aplikacji CalculatorSample nie istnieje zależność od projektu do projektu, a przykład może zostać uruchomiony pomyślnie po zaktualizowaniu usługi CalculatorService. Jednak w innych przypadkach z różnymi zależnościami może być konieczne zaktualizowanie innych projektów w tym samym rozwiązaniu.

Po uaktualnieniu

Po uaktualnieniu projektów należy je skompilować i przetestować. Asystent uaktualniania zrobi to, co może, ale nie może rozwiązać każdej niezgodności w ramach uaktualnienia projektu. Na przykład możliwe jest, że wersja programu .NET Framework aplikacji zawiera odwołania do biblioteki, których projekt nie używa. Należy przeanalizować każde odwołanie i określić, czy jest to wymagane. Narzędzie mogło również dodać lub uaktualnić odwołanie pakietu NuGet do niewłaściwej wersji.

Wskazówki dotyczące rozwiązywania problemów

Istnieje kilka znanych problemów, które mogą wystąpić podczas korzystania z Asystenta uaktualniania platformy .NET. W niektórych przypadkach te problemy dotyczą narzędzia try-convert używanego wewnętrznie przez asystenta uaktualniania platformy .NET.

Repozytorium GitHub narzędzia zawiera więcej porad dotyczących rozwiązywania problemów i znanych problemów.

Zobacz też