Впрочем минималистичен веб сървър с неткор е около симпатичен като на руби:
//#!/usr/bin/env dotnet run --no-restore
using System;
using System.IO;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
public class Startup {
public static string Host = "0.0.0.0";
public static int Port = 3001;
public void Configure(IApplicationBuilder app) {
app.Run(async (ctx) => {
var req = ctx.Request;
var res = ctx.Response;
res.StatusCode = 200;
res.Headers.Add("Content-Type", "text/html");
await res.WriteAsync(@"
<!DOCTYPE html>
<html lang=""en"" style=""font-family: Avenir, 'avenir is good', sans-serif;"">
<head>
<meta charset=""utf-8"" >
<title>Yo</title>
</head>
<body>
<h1>Bang</h1>
<p>gang
</p>
</body>
</html>
");
});
}
}
public class Program {
public static IWebHostBuilder CreateWebHostBuilder(string] args) =>
WebHost.CreateDefaultBuilder(args).
UseConfiguration(
new ConfigurationBuilder().
AddCommandLine(args).
Build()
).
UseStartup<Startup>().
UseUrls($"http://{Startup.Host}:{Startup.Port}");
public static void Main(string[ args) {
CreateWebHostBuilder(args).Build().Run();
}
}
`
Аз местя UseUrls да се чете от appsettings.json с KestrelOptions по разбираеми причини . Например:
"Kestrel": {
"EndPoints": {
"Https": {
"Url": "https://*:3001"
}
},
"Limits": {
"MaxConcurrentConnections": 1000,
"MaxConcurrentUpgradedConnections": 1000,
"MaxRequestBodySize": 10240,
"MaxRequestHeaderCount": 100,
"KeepAliveTimeout": "00:02:00",
"RequestHeadersTimeout": "00:01:00"
},
"DisableStringReuse": true,
"AddServerHeader": false,
"Certificates": {
"Default": {
"Subject": "localhost",
"Store": "My",
"Location": "LocalMachine",
"AllowInvalid": "true"
}
}
},
"AllowedHosts": "*",
После в Program.cs
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host
.CreateDefaultBuilder(args)
.ConfigureServices(CreateServices)
.ConfigureWebHostDefaults(CreateWebHost);
}
private static void CreateServices(HostBuilderContext context, IServiceCollection services)
{
services
.Configure<KestrelServerOptions>(
context.Configuration.GetSection("Kestrel"));
}
private static void CreateWebHost(IWebHostBuilder builder)
{
builder
.UseKestrel()
.ConfigureAppConfiguration(CreateConfiguration)
.UseStartup<Startup>();
}
private static void CreateConfiguration(WebHostBuilderContext ctx, IConfigurationBuilder builder)
{
builder
.SetBasePath(PathUtility.GetBasePath())
.AddJsonFile(
"appsettings.json",
optional: false,
reloadOnChange: true)
.AddJsonFile(
$"appsettings.{ctx.GetEnvironment()}.json",
optional: true,
reloadOnChange: true)
.AddEnvironmentVariables();
}
Ако имам сървиси на queue само с heartbeat over http, даже не слагам Startup.cs, пердаша го в Program.cs
DI-а го нагласям в CreateServices(...). Но:
private static void CreateWebHost(IWebHostBuilder builder)
{
builder
.UseKestrel()
.Configure(CreateApplicationBuilder);
}
private static void CreateApplicationBuilder(IApplicationBuilder builder)
{
builder.UseRouting();
builder.UseEndpoints(endpoints =>
{
endpoints.MapGet("/{addr}", (handle the endpoint));
});
}
ПС: Авенир как го зареждаш без линк към google fonts?