Actualizando de .Net Core 2.2 a 3.1
Tags: netcore, develop, csharp, rest
Published: 2019-12-23 04:33:17

He trabajado varias veces con .Net desde el framework 3.5, y aunque .Net Core cambio drásticamente en web se ha cambiado de WebForms a MVC y a .Net Core Razor, Blazor, en escritorio de Winforms, WPF, UWP, creo había actualizado sin problemas entre versiones.

De .Net Core 1.1 al 2 no cambio tanto, mas del 2.2 al 3.0 me parece hay varios cambios y algunas librerías como Swagger, OData, la de MySQL tanto la de Oracle como la de Pomelo, para poder actualizar mi proyecto tuve que instalar Packages que están en versión beta aún, se me hace raro de OData ya que el paquete es de Microsoft y hasta hace apenas unos días logre hacer funcionar el proyecto con una nueva versión beta.

Aquí agrego los cambios que tuve que realizar:

Instale los siguientes paquetes en modo beta/release

```
Install-Package Microsoft.AspNetCore.OData -Version 7.3.0-beta
Install-Package Swashbuckle.AspNetCore -Version 5.0.0-rc5
```

Actualmente ya salieron las versiones finales de los paquetes que son compatibles

Tuve que cambiar el archivo csproject para remover el siguiente código

```
<PackageReference Include="Microsoft.AspNetCore.App">
       <PrivateAssets Condition="'%(PackageReference.Version)' == ''">all</PrivateAssets>
       <Publish Condition="'%(PackageReference.Version)' == ''">true</Publish>
</PackageReference>
```

Ahora se separa para que si solo usas Servicios REST utilices solo la parte de Controller y no todo el mvc y para regresar los Json con la primer letra en mayúscula, tuve que cambiar **CamelCasePropertyNamesContractResolver()** por JsonOptions.JsonSerializerOptions.PropertyNamingPolicy = null

```
//services.AddMvc()
// .AddJsonOptions(JsonOptions => JsonOptions.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver())
services.AddControllers()
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
                 .AddJsonOptions(JsonOptions =>
                     JsonOptions.JsonSerializerOptions.PropertyNamingPolicy = null)
```

También se cambio la autenticación y esta separado en 2

```
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
```
Otro de los cambios es que ya crearon su propia librería para trabajar con json **System.Text.Json** por lo tanto ya no usan mas Newtonsoft

Como mis servicios están documentados en Swagger aparte de instalar la versión rc4 y luego la rc5, en lugar de usar **Info** se utiliza ahora **OpenApiInfo** y agregar el import **Microsoft.OpenApi.Models**, como utilizo OData tuve que cambiar el código para habilitar OData como **Operation** y ** NonBodyParameter** por **OpenApiParameter**

```
using Microsoft.OpenApi.Models;
// new Info()  Anterior
new OpenApiInfo()
//public void Apply(Operation operation, OperationFilterContext context)
public void Apply(OpenApiOperation operation, OperationFilterContext context)
//foreach (var parameter in operation.Parameters.OfType<NonBodyParameter>())
foreach (var parameter in operation.Parameters.OfType<OpenApiParameter>())
```

Como el proyecto incluye pruebas automáticas según el Environment utilizo un base de datos en memoria o la de SQL, cambiando ** IHostingEnvironment** por **IWebHostEnvironment** agregando el siguiente namespace **Microsoft.Extensions.Hosting**

```
//IHostingEnvironment _hostingEnvironment;
IWebHostEnvironment _hostingEnvironment;
```

Para GraphQL lo único que tuve que realizar fue agregar una configuración para permitir funciones asincronas

```
services.Configure<KestrelServerOptions>(options =>
             {
                 options.AllowSynchronousIO = true;
             });
```

Lo más tardado fue esperar por las versiones beta, sobre todo la de OData que por lo general tarda mucho en estar lista, junto con la de MySQL que la versión de Oracle tarda demasiado y la de Pomelo tarda menos y suele tener menos bugs que la de Oracle. 

Pensé que el que podría fallar más seria GraphQL ya que no es muy común para .net, es más común con NodeJS, mas con GraphQL no tuve en realidad problemas.

Puedes ver la lista completa de breaking changes 

[https://docs.microsoft.com/en-us/dotnet/core/compatibility/2.2-3.1](https://docs.microsoft.com/en-us/dotnet/core/compatibility/2.2-3.1)