Поделиться через


Обновление серверного проекта WCF до CoreWCF

Помощник по обновлению .NET — это средство командной строки, которое может помочь в обновлении существующего проекта WCF Server на платформа .NET Framework для использования служб CoreWCF в .NET 6. Эта статья содержит:

  • Все, что нужно знать перед началом работы.
  • Демонстрация запуска средства на стороне WCF-проекта на платформа .NET Framework.
  • Советы по устранению неполадок.

Сведения, которые необходимо знать перед началом работы

В настоящее время это средство поддерживает проекты C# и использует CoreWCF для переноса локальных проектов WCF Server на .NET 6.

Внимание

Для обновления проектов WCF требуется устаревшая версия помощника по обновлению .NET и несовместима с последними версиями. Инструкции по установке устаревшей версии приведены в разделе "Установка устаревшей версии ".

Чтобы проект WCF применялось для этого обновления, он должен соответствовать следующим требованиям:

  1. Включает файл .cs, который ссылается System.ServiceModel и создает новый ServiceHost.

    Если проект WCF имеет несколько ServiceHost, все узлы должны быть созданы в одном методе.

  2. Содержит файл конфигурации .config, в который хранятся System.ServiceModel свойства.

Текущая версия средства не поддерживает проекты WCF, размещенные через SVC-файлы.

Примечание.

Если проект неприменим для этого средства, рекомендуем ознакомиться с пошаговым руководством по CoreWCF и демонстрацией BeanPoint и вручную обновить проект.

Необходимые компоненты

Установка устаревшей версии

dotnet Используйте команду для установки версии 0.4.421302 помощника по обновлению .NET.

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

Внимание

Если вы настроили дополнительные источники веб-каналов NuGet, установка может завершиться ошибкой, указывающей, что пакет NuGet недоступен в веб-канале. --ignore-failed-sources Используйте параметр для обработки этих сбоев как предупреждений вместо ошибок, обходя другие источники веб-канала NuGet:

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

Демонстрационное приложение

Пример проекта калькулятора "Базовый " можно использовать для тестирования обновления с помощью помощника по обновлению, который также является демонстрацией, используемой в этой документации.

Если вы хотите попробовать более сложный пример, см . пример BeanDb, созданный Майком Rousos.

Запуск upgrade-assistant

Откройте терминал и перейдите в папку, в которой находится целевой проект или решение. upgrade-assistant upgrade Выполните команду, передав имя проекта или решения, которое вы обновляете.

При предоставлении проекта процесс обновления начинается немедленно. Если предоставляется решение, вы выберете проект, который обычно выполняется, называется точкой входа обновления. На основе этого проекта создается граф зависимостей и предложение о том, какой заказ необходимо обновить проекты.

upgrade-assistant upgrade .\CalculatorSample.sln

Средство запускается и отображает список выполняемых действий. По мере завершения каждого шага средство предоставляет набор команд, позволяющих пользователю применить или пропустить следующий шаг или другой вариант, например:

  • Дополнительные сведения о шаге.
  • Изменение проектов.
  • Настройте параметры ведения журнала.
  • Остановите обновление и завершите работу.

Нажатие клавиши ВВОД без выбора числа выбирает первый элемент в списке.

По мере инициализации каждого шага он может предоставить сведения о том, что он думает, будет происходить при применении шага.

Выберите точку входа и проект для обновления

Первым шагом в обновлении примера калькулятора "Базовый" является выбор проекта в решении, который служит в качестве проекта точки входа.

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

Выберите команду 1 , чтобы запустить этот шаг. Результаты отображаются:

[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

В списке есть два проекта. Так как наше средство обновляет серверный проект, мы будем выбирать команду 2 , чтобы выбрать проект службы в качестве точки входа.

Обновление проекта

После выбора проекта появится список шагов обновления, которые будет предпринять средство.

Внимание

На основе проекта, который вы обновляете, вы можете или не увидеть каждый шаг, указанный в этом примере.

В следующих выходных данных описываются шаги, связанные с обновлением проекта:

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

Примечание.

В остальной части этой статьи шаги обновления не отображаются явным образом, если не требуется что-то важное для вызова. Результаты каждого шага по-прежнему отображаются.

Создайте резервную копию.

В этом примере обновления проекта CalculatorService вы будете применять каждый шаг. Первым шагом, командой 1, является резервное копирование проекта:

[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

Средство выбирает путь резервного копирования по умолчанию с именем текущей папки, но с .backup добавлением к ней. Вы можете выбрать пользовательский путь в качестве альтернативы пути по умолчанию. Для каждого обновленного проекта папка проекта копируется в папку резервной копии. В этом примере CalculatorService папка копируется из CalculatorSample\CalculatorService в CalculatorSample.backup\CalculatorService на этапе резервного копирования:

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

Обновление файла проекта

Проект обновляется с платформа .NET Framework формата проекта до формата проекта пакета SDK для .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

Обратите внимание на выходные данные каждого шага. Обратите внимание, что в примере выходных данных указывается, что после обновления потребуется выполнить ручной шаг:

App.config заменяется appsettings.json в .NET Core. Необходимо удалить App.config и перенести его в appsettings.json, если это применимо к проекту.

В этом примере шаг обновления WCF создаст новую конфигурацию wcf.config на system.serviceModel основе раздела App.config. Нам не потребуется выполнить миграцию в appsettings.json.

Очистка ссылок NuGet

После обновления формата проекта следующим шагом является очистка ссылок на пакет NuGet.

Помимо пакетов, на которые ссылается приложение, файл packages.config содержит ссылки на зависимости этих пакетов. Например, если вы добавили ссылку на пакет A, который зависит от пакета B, оба пакета будут ссылаться в файле packages.config. В новой системе проектов требуется только ссылка на пакет A . На этом шаге анализируются ссылки на пакеты и удаляются те, которые не требуются.

[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

Приложение по-прежнему ссылается на сборки платформа .NET Framework. Некоторые из этих сборок могут быть доступны в виде пакетов NuGet. Этот шаг анализирует эти сборки и ссылается на соответствующий пакет NuGet.

В этом примере обработчик обновления пакетов обнаруживает КалькуляторСлужбу как проект только для сервера и не требуется добавлять System.ServiceModel пакеты. Несмотря на то, что они были добавлены в список на основе конфигурации сопоставления пакетов, эти шаги не были применены.

Обработка TFM

Затем средство изменяет TFM с платформа .NET Framework на предлагаемый пакет SDK. В нашем примере это значение выглядит следующим образом: 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

Обновление пакетов NuGet

Затем средство обновляет пакеты NuGet проекта до версий, поддерживающих обновленный 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

Добавление файлов шаблона

После обновления пакетов необходимо обновить все файлы шаблонов. В этом примере нет файлов шаблонов, которые необходимо обновить или добавить в проект. Этот шаг пропускается, и следующий шаг автоматически запускается.

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

Обновление службы WCF до CoreWCF (предварительная версия)

Примечание. На момент написания этой документации расширение обновления WCF предоставляется в качестве предварительного выпуска. Если у вас есть отзывы о предварительной версии, откройте проблему в репозитории помощника по обновлению GitHub с area:WCF тегом.

Помощник по обновлению сначала инициализирует шаг обновления WCF и проверяет, применим ли проект к обновлению 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

На шаге проверяется файл конфигурации, исходный код и файл проекта отдельно, чтобы определить, применим ли проект к обновлению WCF. Если проект неприменимо (например, не использует WCF или не соответствует требованиям, указанным в начале статьи), сообщение журнала опишите, какой файл не применяется и что отсутствует. Затем шаг будет пропущен, и следующий шаг будет автоматически запущен.

В этом примере КалькуляторSample применим для обновления WCF, и мы будем выбирать команду 1 , чтобы применить этот шаг.

[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

Этот шаг создает обновления и записывает их в исходные файлы по отдельности. Обратите внимание на выходные данные, которые могут уведомить вас об удалении исходных файлов или обновлений вручную после обновления.

Обновление файлов конфигурации и кода

Эти действия могут быть пропущены автоматически инструментом, если средство определяет, что для вашего проекта ничего не нужно делать.

После завершения обновления WCF следующим шагом является обновление файлов конфигурации приложения. В этом примере в файлах конфигурации приложения не требуется ничего обновлять. Шаг WCF уже обновил файлы конфигурации, поэтому этот шаг не будет жаловаться на использование неподдерживаемых system.serviceModelфайлов. Этот шаг пропускается, и следующий шаг автоматически запускается.

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

Последним шагом перед завершением обновления этого проекта является обновление всех устаревших ссылок на код. На основе типа обновляемого проекта для этого шага отображается список известных исправлений кода. Некоторые исправления могут не применяться к проекту.

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

Завершение обновления

Если есть еще несколько проектов для миграции, средство позволяет выбрать проект для следующего обновления. При отсутствии дополнительных проектов для обновления средство приводит вас к шагу завершения обновления:

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

В идеале после успешного запуска средства эти изменения должны отображаться в исходных файлах.

В service.cs файле using System.ServiceModel он был заменен ссылками на CoreWCF. Экземпляр ServiceHost также был удален, а служба размещена в 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();
    }

Для файлов system.serviceModel конфигурации раздел App.config был перемещен в новый файл wcf.configконфигурации, который был создан во время обновления.

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>

Наконец, CalculatorService.csprojв файле проекта пакет SDK был обновлен, чтобы Microsoft.NET.Sdk.Web включить ASP.NET ссылки на основной узел и ссылки на пакеты 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>

Обратите внимание, что в калькулятореSample не существует зависимости проекта к проекту, и пример может выполняться успешно после обновления службы Калькулятора. Но в других случаях с разными зависимостями может потребоваться обновить другие проекты в том же решении.

После обновления

После обновления проектов необходимо скомпилировать и протестировать их. Помощник по обновлению сделает все возможное, но не может решить каждую несовместимость в рамках обновления проекта. Например, возможно, что платформа .NET Framework версия приложения содержит ссылки на библиотеку, которую проект фактически не использует. Необходимо проанализировать каждую ссылку и определить, требуется ли она. Возможно, средство также добавило или обновило ссылку на пакет NuGet до неправильной версии.

Советы по устранению неполадок

Существует несколько известных проблем, которые могут возникнуть при использовании помощника по обновлению .NET. В некоторых случаях эти проблемы связаны с средством try-convert, который помощник по обновлению .NET использует внутри системы.

В репозитории GitHub этого средства содержатся дополнительные советы по устранению неполадок и известные проблемы.

См. также