From 187ed5ae2388cf2e8efbc01b99e253ca9e4320e9 Mon Sep 17 00:00:00 2001 From: Mete Atamel Date: Fri, 11 Oct 2019 17:38:31 -0300 Subject: [PATCH] Changed C# sample to use .NET Core 3.0 and more lean and secure alpine as base image (#1816) * Changed C# sample to use more lean and secure alpine as base image * Updated sample to use .NET Core 3.0 * Fixed typos in README.md * Fixed indentation --- .../hello-world/helloworld-csharp/Dockerfile | 4 +- .../hello-world/helloworld-csharp/Program.cs | 15 +++--- .../hello-world/helloworld-csharp/README.md | 47 ++++++++++--------- .../hello-world/helloworld-csharp/Startup.cs | 16 +++++-- .../helloworld-csharp.csproj | 13 ++--- 5 files changed, 51 insertions(+), 44 deletions(-) diff --git a/docs/serving/samples/hello-world/helloworld-csharp/Dockerfile b/docs/serving/samples/hello-world/helloworld-csharp/Dockerfile index 1209aaa1d..ecfa6a90f 100644 --- a/docs/serving/samples/hello-world/helloworld-csharp/Dockerfile +++ b/docs/serving/samples/hello-world/helloworld-csharp/Dockerfile @@ -1,6 +1,6 @@ # Use Microsoft's official build .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-sdk/ -FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build +FROM mcr.microsoft.com/dotnet/core/sdk:3.0-alpine AS build WORKDIR /app # Install production dependencies. @@ -18,7 +18,7 @@ RUN dotnet publish -c Release -o out # Use Microsoft's official runtime .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-aspnet/ -FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime +FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine AS runtime WORKDIR /app COPY --from=build /app/out ./ diff --git a/docs/serving/samples/hello-world/helloworld-csharp/Program.cs b/docs/serving/samples/hello-world/helloworld-csharp/Program.cs index a5b02b675..e09e1425f 100644 --- a/docs/serving/samples/hello-world/helloworld-csharp/Program.cs +++ b/docs/serving/samples/hello-world/helloworld-csharp/Program.cs @@ -1,6 +1,6 @@ using System; -using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; namespace helloworld_csharp { @@ -8,16 +8,19 @@ namespace helloworld_csharp { public static void Main(string[] args) { - CreateWebHostBuilder(args).Build().Run(); + CreateHostBuilder(args).Build().Run(); } - public static IWebHostBuilder CreateWebHostBuilder(string[] args) + public static IHostBuilder CreateHostBuilder(string[] args) { string port = Environment.GetEnvironmentVariable("PORT") ?? "8080"; string url = String.Concat("http://0.0.0.0:", port); - return WebHost.CreateDefaultBuilder(args) - .UseStartup().UseUrls(url); + return Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup().UseUrls(url); + }); } } -} +} \ No newline at end of file diff --git a/docs/serving/samples/hello-world/helloworld-csharp/README.md b/docs/serving/samples/hello-world/helloworld-csharp/README.md index 401c6c5f5..32044fbdc 100644 --- a/docs/serving/samples/hello-world/helloworld-csharp/README.md +++ b/docs/serving/samples/hello-world/helloworld-csharp/README.md @@ -5,7 +5,7 @@ weight: 1 type: "docs" --- -A simple web app written in C# using .NET Core 2.2 that you can use for testing. +A simple web app written in C# using .NET Core 3.0 that you can use for testing. It reads in an env variable `TARGET` and prints "Hello \${TARGET}!". If TARGET is not specified, it will use "World" as the TARGET. @@ -25,16 +25,16 @@ cd knative-docs/docs/serving/samples/hello-world/helloworld-csharp create one. - [Docker](https://www.docker.com) installed and running on your local machine, and a Docker Hub account configured (we'll use it for a container registry). -- You have installed [.NET Core SDK 2.2](https://www.microsoft.com/net/core). +- You have installed [.NET Core SDK 3.0](https://www.microsoft.com/net/core). ## Recreating the sample code 1. First, make sure you have - [.NET Core SDK 2.2](https://www.microsoft.com/net/core) installed: + [.NET Core SDK 3.0](https://www.microsoft.com/net/core) installed: ```shell dotnet --version - 2.2.102 + 3.0.100 ``` 1. From the console, create a new empty web project using the dotnet command: @@ -43,28 +43,34 @@ cd knative-docs/docs/serving/samples/hello-world/helloworld-csharp dotnet new web -o helloworld-csharp ``` -1. Update the `CreateWebHostBuilder` definition in `Program.cs` by adding +1. Update the `CreateHostBuilder` definition in `Program.cs` by adding `.UseUrls()` to define the serving port: ```csharp - public static IWebHostBuilder CreateWebHostBuilder(string[] args) + public static IHostBuilder CreateHostBuilder(string[] args) { string port = Environment.GetEnvironmentVariable("PORT") ?? "8080"; string url = String.Concat("http://0.0.0.0:", port); - return WebHost.CreateDefaultBuilder(args) - .UseStartup().UseUrls(url); + return Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup().UseUrls(url); + }); } ``` -1. Update the `app.Run(...)` statement in `Startup.cs` to read and return the +1. Update the `app.UseEndpoints(...)` statement in `Startup.cs` to read and return the TARGET environment variable: ```csharp - app.Run(async (context) => + app.UseEndpoints(endpoints => { - var target = Environment.GetEnvironmentVariable("TARGET") ?? "World"; - await context.Response.WriteAsync($"Hello {target}!\n"); + endpoints.MapGet("/", async context => + { + var target = Environment.GetEnvironmentVariable("TARGET") ?? "World"; + await context.Response.WriteAsync($"Hello {target}!\n"); + }); }); ``` @@ -76,28 +82,27 @@ cd knative-docs/docs/serving/samples/hello-world/helloworld-csharp ```docker # Use Microsoft's official build .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-sdk/ - FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build + FROM mcr.microsoft.com/dotnet/core/sdk:3.0-alpine AS build WORKDIR /app - + # Install production dependencies. # Copy csproj and restore as distinct layers. COPY *.csproj ./ RUN dotnet restore - + # Copy local code to the container image. COPY . ./ WORKDIR /app - + # Build a release artifact. RUN dotnet publish -c Release -o out - - + # Use Microsoft's official runtime .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-aspnet/ - FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime + FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine AS runtime WORKDIR /app COPY --from=build /app/out ./ - + # Run the web service on container startup. ENTRYPOINT ["dotnet", "helloworld-csharp.dll"] ``` @@ -187,4 +192,4 @@ To remove the sample app from your cluster, delete the service record: ```shell kubectl delete --filename service.yaml -``` +``` \ No newline at end of file diff --git a/docs/serving/samples/hello-world/helloworld-csharp/Startup.cs b/docs/serving/samples/hello-world/helloworld-csharp/Startup.cs index 8b4babe63..75d7db6dd 100644 --- a/docs/serving/samples/hello-world/helloworld-csharp/Startup.cs +++ b/docs/serving/samples/hello-world/helloworld-csharp/Startup.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; namespace helloworld_csharp { @@ -15,18 +16,23 @@ namespace helloworld_csharp } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } - app.Run(async (context) => + app.UseRouting(); + + app.UseEndpoints(endpoints => { - var target = Environment.GetEnvironmentVariable("TARGET") ?? "World"; - await context.Response.WriteAsync($"Hello {target}!\n"); + endpoints.MapGet("/", async context => + { + var target = Environment.GetEnvironmentVariable("TARGET") ?? "World"; + await context.Response.WriteAsync($"Hello {target}!\n"); + }); }); } } -} +} \ No newline at end of file diff --git a/docs/serving/samples/hello-world/helloworld-csharp/helloworld-csharp.csproj b/docs/serving/samples/hello-world/helloworld-csharp/helloworld-csharp.csproj index d62ba8bec..98e4a2e98 100644 --- a/docs/serving/samples/hello-world/helloworld-csharp/helloworld-csharp.csproj +++ b/docs/serving/samples/hello-world/helloworld-csharp/helloworld-csharp.csproj @@ -1,15 +1,8 @@ - netcoreapp2.1 + netcoreapp3.0 + helloworld_csharp - - - - - - - - - + \ No newline at end of file