Compartir a través de


Actualización de un proyecto del lado servidor WCF a CoreWCF

El Asistente para actualización de .NET es una herramienta de línea de comandos que puede ayudar a actualizar un proyecto del lado servidor de WCF existente en .NET Framework para usar servicios de CoreWCF en .NET 6. Este artículo ofrece:

  • Lo que hay que saber antes de empezar.
  • Demostración de cómo ejecutar la herramienta con un proyecto del lado servidor de WCF en .NET Framework.
  • Sugerencias para la solución de problemas

Cosas que hay que saber antes de empezar

Esta herramienta admite actualmente proyectos de C# y usa CoreWCF para migrar proyectos del lado servidor de WCF autohospedados a .NET 6.

Importante

La actualización de proyectos de WCF requiere una versión heredada del Asistente para actualización de .NET y no es compatible con las versiones más recientes. En la sección Instalación de la versión heredada se proporcionan instrucciones sobre cómo instalar la versión heredada.

Para que un proyecto de WCF sea aplicable a esta actualización, debe cumplir los siguientes requisitos:

  1. Incluye un archivo .cs que hace referencia a System.ServiceModel y crea un nuevo elemento ServiceHost.

    Si el proyecto de WCF tiene varios elementos ServiceHost, todos los hosts deben crearse en el mismo método.

  2. Incluye un archivo de configuración que almacena propiedades System.ServiceModel.

La versión actual de la herramienta no admite proyectos de WCF hospedados a través de archivos .svc.

Nota

Si el proyecto no es aplicable a esta herramienta, le recomendamos que eche un vistazo a la guía del tutorial de CoreWCF y la demostración de ejemplo de BeanTrader y que actualice manualmente el proyecto.

Requisitos previos

Instalación de la versión heredada

Use el comando para instalar la dotnet versión 0.4.421302 del Asistente para actualización de .NET.

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

Importante

Si configuró orígenes adicionales de fuente NuGet, la instalación podría producir un error que indica que el paquete NuGet no está disponible en la fuente. Use el --ignore-failed-sources parámetro para tratar esos errores como advertencias en lugar de errores, omitiendo los otros orígenes de fuente de NuGet:

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

Aplicación de demostración

Puede usar el proyecto Ejemplo de calculadora básica para probar la actualización con el Asistente para actualización, que también es la demostración que se usa en esta documentación.

Si quiere probar un ejemplo más complicado, consulte el ejemplo de BeanTrader creado por Mike Rousos.

Ejecución del asistente para actualización

Abra un terminal y desplácese hasta la carpeta en la que se encuentra el proyecto o la solución de destino. Ejecute el comando upgrade-assistant upgrade y pase el nombre del proyecto o la solución que va a actualizar.

Cuando se proporciona un proyecto, el proceso de actualización se inicia inmediatamente en dicho proyecto. Si se proporciona una solución, seleccionará el proyecto que ejecuta normalmente, lo que se conoce como el punto de entrada de la actualización. En función de ese proyecto, se crea un gráfico de dependencias y se da una sugerencia sobre el orden en el que se deberían actualizar los proyectos.

upgrade-assistant upgrade .\CalculatorSample.sln

La herramienta se ejecuta y muestra una lista de los pasos que realizará. A medida que se completa cada paso, la herramienta proporciona un conjunto de comandos que permiten al usuario aplicar u omitir el paso siguiente o alguna otra opción, como:

  • Obtener más información sobre el paso.
  • Cambiar de proyecto.
  • Ajustar la configuración de registro.
  • Detener la actualización y salir.

Si se presiona Intro sin elegir un número, se selecciona el primer elemento de la lista.

Cada paso, según se inicializa, puede proporcionar información sobre las acciones previstas si se aplica.

Seleccione el punto de entrada y el proyecto que se van a actualizar.

El primer paso en la actualización del ejemplo de calculadora básica es elegir qué proyecto de la solución sirve como proyecto de punto de entrada.

Upgrade Steps

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

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

Elija el comando 1 para iniciar ese paso. Se muestran los resultados:

[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

Se muestran dos proyectos. Dado que nuestra herramienta actualiza el proyecto del lado servidor, elegiremos command 2 para seleccionar el proyecto de servicio como punto de entrada.

Actualización del proyecto

Una vez seleccionado un proyecto, aparece una lista de los pasos de actualización que la herramienta va a llevar a cabo.

Importante

En función del proyecto que esté actualizando, es posible que vea o no todos los pasos enumerados en este ejemplo.

En la salida siguiente se describen los pasos necesarios para actualizar el proyecto:

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

En el resto de este artículo, los pasos de actualización no se muestran explícitamente, a menos que haya algo importante que resaltar. Los resultados de cada paso se siguen mostrando.

Creación de una copia de seguridad

En este ejemplo de actualización del proyecto CalculatorService, aplicará cada paso. El primer paso, el comando 1, es hacer una copia de seguridad del proyecto:

[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

La herramienta elige una ruta de acceso predeterminada para la copia de seguridad, que tiene el nombre de la carpeta actual, pero con la anexión de .backup. Puede elegir una ruta de acceso personalizada como alternativa a la ruta de acceso predeterminada. En cada proyecto actualizado, la carpeta del proyecto se copia en la carpeta de la copia de seguridad. En este ejemplo, la carpeta CalculatorService se copia de CalculatorSample\CalculatorService a CalculatorSample.backup\CalculatorService durante el paso de copia de seguridad:

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

Actualización del archivo del proyecto

El proyecto se actualiza desde el formato de proyecto de .NET Framework al formato de proyecto del SDK de .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

Preste atención a la salida de cada paso. Observe que la salida de ejemplo indica que habrá un paso manual, que tendrá que completar después de la actualización:

App.config se reemplaza por appsettings.json en .NET Core. Tendrá que eliminar App.config y migrar a appsettings.json si es aplicable al proyecto.

En este ejemplo, el paso de actualización de WCF creará un nuevo archivo wcf.config basado en la sección system.serviceModel de App.config. No es necesario migrar a appsettings.json.

Limpieza de referencias a NuGet

Una vez actualizado el formato del proyecto, el siguiente paso es limpiar las referencias al paquete de NuGet.

Además de los paquetes a los que hace referencia la aplicación, el archivo packages.config contiene referencias a las dependencias de esos paquetes. Por ejemplo, si ha agregado una referencia al paquete A que depende del paquete B, se haría referencia a ambos paquetes en el archivo packages.config. En el nuevo sistema de proyectos, solo hace falta la referencia al paquete A. En este paso se analizan las referencias al paquete y se quitan las que no son necesarias.

[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

La aplicación sigue haciendo referencia a los ensamblados de .NET Framework. Algunos de esos ensamblados pueden estar disponibles como paquetes de NuGet. En este paso se analizan esos ensamblados y se hace referencia al paquete de NuGet adecuado.

En este ejemplo, el actualizador de paquetes detecta CalculatorService como un proyecto de solo servidor y no es necesario agregar paquetes System.ServiceModel. Aunque se agregaron a la lista en función de la configuración de asignación de paquetes, no se aplicaron esos pasos.

Control del TFM

Después, la herramienta cambia el TFM de .NET Framework al SDK sugerido. En este ejemplo, es 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

Actualización de paquetes NuGet

Después, la herramienta actualiza los paquetes de NuGet del proyecto a las versiones que admiten el TFM actualizado, 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

Adición de archivos de plantilla

Una vez actualizados los paquetes, el paso siguiente es actualizar los archivos de plantilla. En este ejemplo, no hay ningún archivo de plantilla que deba actualizarse o agregarse al proyecto. Este paso se omite y el siguiente paso se inicia automáticamente.

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

Actualización del servicio WCF a CoreWCF (versión preliminar)

Nota: En el momento en que se escribió esta documentación, la extensión del actualizador de WCF se proporciona en versión preliminar. Si tiene algún comentario sobre la versión preliminar, abra una incidencia en el repositorio de GitHub del Asistente para actualización con area:WCF.

El Asistente para actualización inicializará primero el paso del actualizador de WCF y comprobará si el proyecto es válido para la actualización de 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

El paso comprueba el archivo de configuración, el código fuente y el archivo de proyecto por separado para decidir si el proyecto es válido para la actualización de WCF. Si el proyecto no es válido (por ejemplo, no se usa WCF o no cumple los requisitos indicados al principio del artículo), en el mensaje de registro se describirá qué archivo no era válido y qué faltaba. A continuación, se omitirá el paso y el paso siguiente se iniciaría automáticamente.

En este ejemplo, CalculatorSample es válido para la actualización de WCF y elegiremos command 1 para aplicar el paso.

[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

En este paso se crean las actualizaciones y se escriben en los archivos originales individualmente. Preste atención a la salida, que puede notificarle sobre la eliminación de archivos originales o actualizaciones manuales para completarse después de la actualización.

Actualización de archivos de configuración y código

La herramienta puede omitir automáticamente los pasos siguientes si determina que no tienen ningún papel en el proyecto.

Una vez completada la actualización de WCF, el siguiente paso es actualizar los archivos de configuración de la aplicación. En este ejemplo, no es necesario actualizar nada en los archivos de configuración de la aplicación. El paso de WCF ya actualizó los archivos de configuración, por lo que este paso no se quejará del uso del elemento system.serviceModel no admitido. Este paso se omite y el siguiente paso se inicia automáticamente.

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

El último paso antes de completarse la actualización de este proyecto es actualizar las referencias de código obsoletas. En función del tipo de proyecto que va a actualizar, se muestra una lista de correcciones de código conocidas para este paso. Es posible que algunas de las correcciones no se apliquen al proyecto.

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

En este caso, ninguna de las correcciones sugeridas se aplica al proyecto de ejemplo y este paso se completa de forma automática inmediatamente después de completarse el paso anterior.

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

Finalización de la actualización

Si hay más proyectos que migrar, la herramienta le permite seleccionar el proyecto que se va a actualizar a continuación. Si no hay más proyectos que actualizar, la herramienta le lleva al paso de "Finalize upgrade" (Finalizar la actualización):

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, después de ejecutar correctamente la herramienta, estos cambios deberían aparecer en los archivos originales.

En el archivo service.cs, using System.ServiceModel se reemplazó por referencias a CoreWCF. La instancia de ServiceHost también se quitó y el servicio se hospedó en 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();
    }

En el caso de los archivos de configuración, la sección system.serviceModel de App.config se movió al nuevo archivo de configuración wcf.config, que se generó durante la actualización.

App.config

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

wcf.config

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

Por último, en el archivo del proyecto, CalculatorService.csproj, el SDK se actualizó a Microsoft.NET.Sdk.Web para habilitar el host de ASP.NET Core y se agregaron referencias de paquetes 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>

Observe que en CalculatorSample, no hay una dependencia de proyecto a proyecto y que el ejemplo se puede ejecutar correctamente después de actualizar CalculatorService. Sin embargo, en otros casos con dependencias diferentes, es posible que también tenga que actualizar otros proyectos en la misma solución.

Después de la actualización

Tras actualizar los proyectos, tiene que compilarlos y probarlos. El Asistente para actualización hará lo que pueda, pero no puede resolver todas las incompatibilidades como parte de la actualización del proyecto. Por ejemplo, es posible que la versión de .NET Framework de la aplicación contuviera referencias a bibliotecas que el proyecto, en realidad, no está usando. Debe analizar cada referencia y comprobar si es necesaria o no. Es posible que la herramienta también haya agregado o actualizado una referencia al paquete NuGet a una versión incorrecta.

Sugerencias de solución de problemas

Hay varios problemas conocidos que pueden producirse al usar el Asistente para actualización de .NET. En algunos casos, se trata de problemas con la herramienta try-convert, que el Asistente para actualización de .NET usa internamente.

El repositorio de GitHub de la herramienta contiene más sugerencias para la solución de problemas y problemas conocidos.

Vea también