92 lines
3.6 KiB
C#
92 lines
3.6 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.AspNetCore.Builder;
|
|
using Microsoft.AspNetCore.Hosting;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.Internal;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace SystemdTestApp
|
|
{
|
|
public class Startup
|
|
{
|
|
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
|
|
{
|
|
var logger = loggerFactory.CreateLogger("Default");
|
|
|
|
app.Run(async context =>
|
|
{
|
|
var connectionFeature = context.Connection;
|
|
logger.LogDebug($"Peer: {connectionFeature.RemoteIpAddress?.ToString()}:{connectionFeature.RemotePort}"
|
|
+ $"{Environment.NewLine}"
|
|
+ $"Sock: {connectionFeature.LocalIpAddress?.ToString()}:{connectionFeature.LocalPort}");
|
|
|
|
var response = $"hello, world{Environment.NewLine}";
|
|
context.Response.ContentLength = response.Length;
|
|
context.Response.ContentType = "text/plain";
|
|
await context.Response.WriteAsync(response);
|
|
});
|
|
}
|
|
|
|
public static Task Main(string[] args)
|
|
{
|
|
TaskScheduler.UnobservedTaskException += (sender, e) =>
|
|
{
|
|
Console.WriteLine("Unobserved exception: {0}", e.Exception);
|
|
};
|
|
|
|
var hostBuilder = new WebHostBuilder()
|
|
.ConfigureLogging((_, factory) =>
|
|
{
|
|
factory.AddConsole();
|
|
})
|
|
.UseKestrel((context, options) =>
|
|
{
|
|
var basePort = context.Configuration.GetValue<int?>("BASE_PORT") ?? 5000;
|
|
|
|
// Run callbacks on the transport thread
|
|
options.ApplicationSchedulingMode = SchedulingMode.Inline;
|
|
|
|
options.Listen(IPAddress.Loopback, basePort, listenOptions =>
|
|
{
|
|
// Uncomment the following to enable Nagle's algorithm for this endpoint.
|
|
//listenOptions.NoDelay = false;
|
|
|
|
listenOptions.UseConnectionLogging();
|
|
});
|
|
|
|
options.Listen(IPAddress.Loopback, basePort + 1, listenOptions =>
|
|
{
|
|
listenOptions.UseHttps();
|
|
listenOptions.UseConnectionLogging();
|
|
});
|
|
|
|
options.UseSystemd();
|
|
|
|
// The following section should be used to demo sockets
|
|
//options.ListenUnixSocket("/tmp/kestrel-test.sock");
|
|
})
|
|
.UseContentRoot(Directory.GetCurrentDirectory())
|
|
.UseStartup<Startup>();
|
|
|
|
if (string.Equals(Process.GetCurrentProcess().Id.ToString(), Environment.GetEnvironmentVariable("LISTEN_PID")))
|
|
{
|
|
// Use libuv if activated by systemd, since that's currently the only transport that supports being passed a socket handle.
|
|
hostBuilder.UseLibuv(options =>
|
|
{
|
|
// Uncomment the following line to change the default number of libuv threads for all endpoints.
|
|
// options.ThreadCount = 4;
|
|
});
|
|
}
|
|
|
|
return hostBuilder.Build().RunAsync();
|
|
}
|
|
}
|
|
} |