net 5 webapps

This commit is contained in:
Borja García Rodríguez 2020-12-18 09:48:28 +01:00
parent 2dab60f278
commit 5fa317f5c4
26 changed files with 190 additions and 252 deletions

View File

@ -1,8 +1,8 @@
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src WORKDIR /src
# It's important to keep lines from here down to "COPY . ." identical in all Dockerfiles # It's important to keep lines from here down to "COPY . ." identical in all Dockerfiles

View File

@ -1,79 +1,77 @@
using Microsoft.AspNetCore; using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.eShopOnContainers.WebMVC;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Serilog; using Serilog;
using System; using System;
using System.IO; using System.IO;
namespace Microsoft.eShopOnContainers.WebMVC var configuration = GetConfiguration();
Log.Logger = CreateSerilogLogger(configuration);
try
{ {
public class Program Log.Information("Configuring web host ({ApplicationContext})...", Program.AppName);
var host = BuildWebHost(configuration, args);
Log.Information("Starting web host ({ApplicationContext})...", Program.AppName);
host.Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Program terminated unexpectedly ({ApplicationContext})!", Program.AppName);
return 1;
}
finally
{
Log.CloseAndFlush();
}
IWebHost BuildWebHost(IConfiguration configuration, string[] args) =>
WebHost.CreateDefaultBuilder(args)
.CaptureStartupErrors(false)
.ConfigureAppConfiguration(x => x.AddConfiguration(configuration))
.UseStartup<Startup>()
.UseSerilog()
.Build();
Serilog.ILogger CreateSerilogLogger(IConfiguration configuration)
{
var seqServerUrl = configuration["Serilog:SeqServerUrl"];
var logstashUrl = configuration["Serilog:LogstashgUrl"];
var cfg = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.WithProperty("ApplicationContext", Program.AppName)
.Enrich.FromLogContext()
.WriteTo.Console();
if (!string.IsNullOrWhiteSpace(seqServerUrl))
{ {
public static readonly string Namespace = typeof(Program).Namespace; cfg.WriteTo.Seq(seqServerUrl);
public static readonly string AppName = Namespace.Substring(Namespace.LastIndexOf('.', Namespace.LastIndexOf('.') - 1) + 1);
public static int Main(string[] args)
{
var configuration = GetConfiguration();
Log.Logger = CreateSerilogLogger(configuration);
try
{
Log.Information("Configuring web host ({ApplicationContext})...", AppName);
var host = BuildWebHost(configuration, args);
Log.Information("Starting web host ({ApplicationContext})...", AppName);
host.Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Program terminated unexpectedly ({ApplicationContext})!", AppName);
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
private static IWebHost BuildWebHost(IConfiguration configuration, string[] args) =>
WebHost.CreateDefaultBuilder(args)
.CaptureStartupErrors(false)
.ConfigureAppConfiguration(x => x.AddConfiguration(configuration))
.UseStartup<Startup>()
.UseSerilog()
.Build();
private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration)
{
var seqServerUrl = configuration["Serilog:SeqServerUrl"];
var logstashUrl = configuration["Serilog:LogstashgUrl"];
var cfg = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.WithProperty("ApplicationContext", AppName)
.Enrich.FromLogContext()
.WriteTo.Console();
if (!string.IsNullOrWhiteSpace(seqServerUrl)) {
cfg.WriteTo.Seq(seqServerUrl);
}
if (!string.IsNullOrWhiteSpace(logstashUrl)) {
cfg.WriteTo.Http(logstashUrl);
}
return cfg.CreateLogger();
}
private static IConfiguration GetConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
return builder.Build();
}
} }
if (!string.IsNullOrWhiteSpace(logstashUrl))
{
cfg.WriteTo.Http(logstashUrl);
}
return cfg.CreateLogger();
}
IConfiguration GetConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
return builder.Build();
}
public class Program
{
private static readonly string _namespace = typeof(Startup).Namespace;
public static readonly string AppName = _namespace.Substring(_namespace.LastIndexOf('.', _namespace.LastIndexOf('.') - 1) + 1);
} }

View File

@ -3,35 +3,35 @@ using System.ComponentModel.DataAnnotations;
namespace WebMVC.Services.ModelDTOs namespace WebMVC.Services.ModelDTOs
{ {
public class BasketDTO public record BasketDTO
{ {
[Required] [Required]
public string City { get; set; } public string City { get; init; }
[Required] [Required]
public string Street { get; set; } public string Street { get; init; }
[Required] [Required]
public string State { get; set; } public string State { get; init; }
[Required] [Required]
public string Country { get; set; } public string Country { get; init; }
public string ZipCode { get; set; } public string ZipCode { get; init; }
[Required] [Required]
public string CardNumber { get; set; } public string CardNumber { get; init; }
[Required] [Required]
public string CardHolderName { get; set; } public string CardHolderName { get; init; }
[Required] [Required]
public DateTime CardExpiration { get; set; } public DateTime CardExpiration { get; init; }
[Required] [Required]
public string CardSecurityNumber { get; set; } public string CardSecurityNumber { get; init; }
public int CardTypeId { get; set; } public int CardTypeId { get; init; }
public string Buyer { get; set; } public string Buyer { get; init; }
[Required] [Required]
public Guid RequestId { get; set; } public Guid RequestId { get; init; }
} }
} }

View File

@ -1,8 +1,8 @@
namespace WebMVC.Services.ModelDTOs namespace WebMVC.Services.ModelDTOs
{ {
public class LocationDTO public record LocationDTO
{ {
public double Longitude { get; set; } public double Longitude { get; init; }
public double Latitude { get; set; } public double Latitude { get; init; }
} }
} }

View File

@ -2,9 +2,9 @@
namespace WebMVC.Services.ModelDTOs namespace WebMVC.Services.ModelDTOs
{ {
public class OrderDTO public record OrderDTO
{ {
[Required] [Required]
public string OrderNumber { get; set; } public string OrderNumber { get; init; }
} }
} }

View File

@ -1,9 +1,9 @@
namespace WebMVC.Services.ModelDTOs namespace WebMVC.Services.ModelDTOs
{ {
public class OrderProcessAction public record OrderProcessAction
{ {
public string Code { get; private set; } public string Code { get; }
public string Name { get; private set; } public string Name { get; }
public static OrderProcessAction Ship = new OrderProcessAction(nameof(Ship).ToLowerInvariant(), "Ship"); public static OrderProcessAction Ship = new OrderProcessAction(nameof(Ship).ToLowerInvariant(), "Ship");

View File

@ -7,19 +7,16 @@ using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.eShopOnContainers.WebMVC.Services; using Microsoft.eShopOnContainers.WebMVC.Services;
using Microsoft.eShopOnContainers.WebMVC.ViewModels; using Microsoft.eShopOnContainers.WebMVC.ViewModels;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Logging; using Microsoft.IdentityModel.Logging;
using StackExchange.Redis; using StackExchange.Redis;
using System; using System;
using System.IdentityModel.Tokens.Jwt; using System.IdentityModel.Tokens.Jwt;
using System.Net.Http;
using WebMVC.Infrastructure; using WebMVC.Infrastructure;
using WebMVC.Infrastructure.Middlewares; using WebMVC.Infrastructure.Middlewares;
using WebMVC.Services; using WebMVC.Services;

View File

@ -1,18 +1,17 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
{ {
public class Basket public record Basket
{ {
// Use property initializer syntax. // Use property initializer syntax.
// While this is often more useful for read only // While this is often more useful for read only
// auto implemented properties, it can simplify logic // auto implemented properties, it can simplify logic
// for read/write properties. // for read/write properties.
public List<BasketItem> Items { get; set; } = new List<BasketItem>(); public List<BasketItem> Items { get; init; } = new List<BasketItem>();
public string BuyerId { get; set; } public string BuyerId { get; init; }
public decimal Total() public decimal Total()
{ {

View File

@ -1,18 +1,13 @@
using System; namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
{ {
public class BasketItem public record BasketItem
{ {
public string Id { get; set; } public string Id { get; init; }
public string ProductId { get; set; } public string ProductId { get; init; }
public string ProductName { get; set; } public string ProductName { get; init; }
public decimal UnitPrice { get; set; } public decimal UnitPrice { get; init; }
public decimal OldUnitPrice { get; set; } public decimal OldUnitPrice { get; init; }
public int Quantity { get; set; } public int Quantity { get; init; }
public string PictureUrl { get; set; } public string PictureUrl { get; init; }
} }
} }

View File

@ -1,12 +1,12 @@
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels using System.Collections.Generic;
{
using System.Collections.Generic;
public class Campaign namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
{
public record Campaign
{ {
public int PageIndex { get; set; } public int PageIndex { get; init; }
public int PageSize { get; set; } public int PageSize { get; init; }
public int Count { get; set; } public int Count { get; init; }
public List<CampaignItem> Data { get; set; } public List<CampaignItem> Data { get; init; }
} }
} }

View File

@ -1,20 +1,20 @@
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels using System;
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
{ {
using System; public record CampaignItem
public class CampaignItem
{ {
public int Id { get; set; } public int Id { get; init; }
public string Name { get; set; } public string Name { get; init; }
public string Description { get; set; } public string Description { get; init; }
public DateTime From { get; set; } public DateTime From { get; init; }
public DateTime To { get; set; } public DateTime To { get; init; }
public string PictureUri { get; set; } public string PictureUri { get; init; }
public string DetailsUri { get; set; } public string DetailsUri { get; init; }
} }
} }

View File

@ -1,10 +1,4 @@
using Microsoft.AspNetCore.Mvc.Rendering; namespace Microsoft.eShopOnContainers.WebMVC.ViewModels.CartViewModels
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels.CartViewModels
{ {
public class CartComponentViewModel public class CartComponentViewModel
{ {

View File

@ -1,15 +1,12 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
{ {
public class Catalog public record Catalog
{ {
public int PageIndex { get; set; } public int PageIndex { get; init; }
public int PageSize { get; set; } public int PageSize { get; init; }
public int Count { get; set; } public int Count { get; init; }
public List<CatalogItem> Data { get; set; } public List<CatalogItem> Data { get; init; }
} }
} }

View File

@ -1,18 +1,15 @@
using System; namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
{ {
public class CatalogItem public record CatalogItem
{ {
public int Id { get; set; } public int Id { get; init; }
public string Name { get; set; } public string Name { get; init; }
public string Description { get; set; } public string Description { get; init; }
public decimal Price { get; set; } public decimal Price { get; init; }
public string PictureUri { get; set; } public string PictureUri { get; init; }
public int CatalogBrandId { get; set; } public int CatalogBrandId { get; init; }
public string CatalogBrand { get; set; } public string CatalogBrand { get; init; }
public int CatalogTypeId { get; set; } public int CatalogTypeId { get; init; }
public string CatalogType { get; set; } public string CatalogType { get; init; }
} }
} }

View File

@ -1,9 +1,6 @@
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.eShopOnContainers.WebMVC.ViewModels.Pagination; using Microsoft.eShopOnContainers.WebMVC.ViewModels.Pagination;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels.CatalogViewModels namespace Microsoft.eShopOnContainers.WebMVC.ViewModels.CatalogViewModels
{ {

View File

@ -1,10 +1,8 @@
using System; namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
{ {
public class Header public record Header
{ {
public string Controller { get; set; } public string Controller { get; init; }
public string Text { get; set; } public string Text { get; init; }
} }
} }

View File

@ -1,22 +1,17 @@
using System; namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
{ {
public class OrderItem public record OrderItem
{ {
public int ProductId { get; set; } public int ProductId { get; init; }
public string ProductName { get; set; } public string ProductName { get; init; }
public decimal UnitPrice { get; set; } public decimal UnitPrice { get; init; }
public decimal Discount { get; set; } public decimal Discount { get; init; }
public int Units { get; set; } public int Units { get; init; }
public string PictureUrl { get; set; } public string PictureUrl { get; init; }
} }
} }

View File

@ -1,9 +1,4 @@
using System; namespace Microsoft.eShopOnContainers.WebMVC.ViewModels.Pagination
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels.Pagination
{ {
public class PaginationInfo public class PaginationInfo
{ {

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>net5.0</TargetFramework>
<UserSecretsId>aspnet-Microsoft.eShopOnContainers-946ae052-8305-4a99-965b-ec8636ddbae3</UserSecretsId> <UserSecretsId>aspnet-Microsoft.eShopOnContainers-946ae052-8305-4a99-965b-ec8636ddbae3</UserSecretsId>
<DockerComposeProjectPath>..\..\..\docker-compose.dcproj</DockerComposeProjectPath> <DockerComposeProjectPath>..\..\..\docker-compose.dcproj</DockerComposeProjectPath>
<TypeScriptToolsVersion>3.0</TypeScriptToolsVersion> <TypeScriptToolsVersion>3.0</TypeScriptToolsVersion>

View File

@ -1,5 +1,5 @@
ARG NODE_IMAGE=node:12.0 ARG NODE_IMAGE=node:12.0
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base FROM mcr.microsoft.com/dotnet/core/aspnet:5.0 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
@ -10,7 +10,7 @@ COPY Web/WebSPA/package-lock.json .
COPY Web/WebSPA . COPY Web/WebSPA .
RUN npm i npm@latest -g && npm update && npm install && npm run build:prod RUN npm i npm@latest -g && npm update && npm install && npm run build:prod
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build FROM mcr.microsoft.com/dotnet/core/5.0 AS build
WORKDIR /src WORKDIR /src
# It's important to keep lines from here down to "COPY . ." identical in all Dockerfiles # It's important to keep lines from here down to "COPY . ." identical in all Dockerfiles

View File

@ -4,38 +4,30 @@ using System.IO;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Serilog; using Serilog;
using eShopConContainers.WebSPA;
namespace eShopConContainers.WebSPA BuildWebHost(args).Run();
{
public class Program IWebHost BuildWebHost(string[] args) =>
{ WebHost.CreateDefaultBuilder(args)
public static void Main(string[] args) .UseStartup<Startup>()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((builderContext, config) =>
{ {
BuildWebHost(args).Run(); config.AddEnvironmentVariables();
} })
.ConfigureLogging((hostingContext, builder) =>
public static IWebHost BuildWebHost(string[] args) => {
WebHost.CreateDefaultBuilder(args) builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
.UseStartup<Startup>() builder.AddConsole();
.UseContentRoot(Directory.GetCurrentDirectory()) builder.AddDebug();
.ConfigureAppConfiguration((builderContext, config) => builder.AddAzureWebAppDiagnostics();
{ })
config.AddEnvironmentVariables(); .UseSerilog((builderContext, config) =>
}) {
.ConfigureLogging((hostingContext, builder) => config
{ .MinimumLevel.Information()
builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); .Enrich.FromLogContext()
builder.AddConsole(); .WriteTo.Console();
builder.AddDebug(); })
builder.AddAzureWebAppDiagnostics(); .Build();
})
.UseSerilog((builderContext, config) =>
{
config
.MinimumLevel.Information()
.Enrich.FromLogContext()
.WriteTo.Console();
})
.Build();
}
}

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>net5.0</TargetFramework>
<UserSecretsId>aspnetcorespa-c23d27a4-eb88-4b18-9b77-2a93f3b15119</UserSecretsId> <UserSecretsId>aspnetcorespa-c23d27a4-eb88-4b18-9b77-2a93f3b15119</UserSecretsId>
<DockerComposeProjectPath>..\..\..\docker-compose.dcproj</DockerComposeProjectPath> <DockerComposeProjectPath>..\..\..\docker-compose.dcproj</DockerComposeProjectPath>
<TypeScriptCompileOnSaveEnabled>false</TypeScriptCompileOnSaveEnabled> <TypeScriptCompileOnSaveEnabled>false</TypeScriptCompileOnSaveEnabled>

View File

@ -1,9 +1,9 @@
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base FROM mcr.microsoft.com/dotnet/core/aspnet:5.0 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
EXPOSE 443 EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build FROM mcr.microsoft.com/dotnet/core/sdk:5.0 AS build
WORKDIR /src WORKDIR /src
# It's important to keep lines from here down to "COPY . ." identical in all Dockerfiles # It's important to keep lines from here down to "COPY . ." identical in all Dockerfiles

View File

@ -1,24 +1,10 @@
using System; using Microsoft.AspNetCore;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration; using WebhookClient;
using Microsoft.Extensions.Logging;
namespace WebhookClient CreateWebHostBuilder(args).Build().Run();
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args) IWebHostBuilder CreateWebHostBuilder(string[] args) =>
.UseStartup<Startup>(); WebHost.CreateDefaultBuilder(args)
} .UseStartup<Startup>();
}

View File

@ -1,6 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using WebhookClient.Models; using WebhookClient.Models;

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>net5.0</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS> <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<UserSecretsId>36215d41-f31a-4aa6-9929-bd67d650e7b5</UserSecretsId> <UserSecretsId>36215d41-f31a-4aa6-9929-bd67d650e7b5</UserSecretsId>