From dfa10de2027af996f3b85b25989994cb75d66aa6 Mon Sep 17 00:00:00 2001 From: Christophe CHATEAU Date: Tue, 12 May 2026 00:01:45 +0200 Subject: [PATCH 1/2] update simplew and simplew-tuned --- frameworks/simplew-tuned/Dockerfile | 15 + frameworks/simplew-tuned/Model.cs | 69 +++ frameworks/simplew-tuned/Program.cs | 461 ++++++++++++++++++ frameworks/simplew-tuned/README.md | 31 ++ frameworks/simplew-tuned/meta.json | 26 + .../simplew.csproj} | 0 frameworks/simplew/Dockerfile | 4 +- frameworks/simplew/Program.cs | 4 - frameworks/simplew/README.md | 2 +- frameworks/simplew/meta.json | 2 +- frameworks/simplew/simplew.csproj | 13 + 11 files changed, 619 insertions(+), 8 deletions(-) create mode 100644 frameworks/simplew-tuned/Dockerfile create mode 100644 frameworks/simplew-tuned/Model.cs create mode 100644 frameworks/simplew-tuned/Program.cs create mode 100644 frameworks/simplew-tuned/README.md create mode 100644 frameworks/simplew-tuned/meta.json rename frameworks/{simplew/simplew-bench.csproj => simplew-tuned/simplew.csproj} (100%) create mode 100644 frameworks/simplew/simplew.csproj diff --git a/frameworks/simplew-tuned/Dockerfile b/frameworks/simplew-tuned/Dockerfile new file mode 100644 index 000000000..432489dc5 --- /dev/null +++ b/frameworks/simplew-tuned/Dockerfile @@ -0,0 +1,15 @@ +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build +WORKDIR /source + +COPY simplew.csproj ./ +RUN dotnet restore + +COPY . . +RUN dotnet publish -c Release --no-self-contained -o /app + +FROM mcr.microsoft.com/dotnet/runtime:10.0 +WORKDIR /app +COPY --from=build /app . + +EXPOSE 8080 8081 +ENTRYPOINT ["dotnet", "simplew.dll"] diff --git a/frameworks/simplew-tuned/Model.cs b/frameworks/simplew-tuned/Model.cs new file mode 100644 index 000000000..8a70c06c3 --- /dev/null +++ b/frameworks/simplew-tuned/Model.cs @@ -0,0 +1,69 @@ +namespace SimpleW.Benchmarks; + +public class DatasetItem +{ + public int Id { get; set; } + public string Name { get; set; } = ""; + public string Category { get; set; } = ""; + public int Price { get; set; } + public int Quantity { get; set; } + public bool Active { get; set; } + public List? Tags { get; set; } + public RatingInfo? Rating { get; set; } +} + +public class ProcessedItem +{ + public int Id { get; set; } + public string Name { get; set; } = ""; + public string Category { get; set; } = ""; + public int Price { get; set; } + public int Quantity { get; set; } + public bool Active { get; set; } + public List? Tags { get; set; } + public RatingInfo? Rating { get; set; } + public long Total { get; set; } +} + +public class DbItem +{ + public int Id { get; set; } + public string Name { get; set; } = ""; + public string Category { get; set; } = ""; + public int Price { get; set; } + public int Quantity { get; set; } + public bool Active { get; set; } + public List? Tags { get; set; } + public RatingInfo? Rating { get; set; } +} + +public class RatingInfo +{ + public int Score { get; set; } + public int Count { get; set; } +} + +public class ListWithCount(List items) +{ + + public List Items => items; + + public int Count => items.Count; +} + +public class CrudListResponse +{ + public List Items { get; set; } = []; + public long Total { get; set; } + public int Page { get; set; } + public int Limit { get; set; } +} + +public class CrudItem +{ + public int Id { get; set; } + public string? Name { get; set; } + public string? Category { get; set; } + public int Price { get; set; } + public int Quantity { get; set; } +} diff --git a/frameworks/simplew-tuned/Program.cs b/frameworks/simplew-tuned/Program.cs new file mode 100644 index 000000000..a1fe392e4 --- /dev/null +++ b/frameworks/simplew-tuned/Program.cs @@ -0,0 +1,461 @@ +using System.Buffers; +using System.Buffers.Text; +using System.Collections.Concurrent; +using System.IO.Compression; +using System.Net; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Text.Json; + +using Npgsql; + +using SimpleW; +using SimpleW.Modules; +using SimpleW.Benchmarks; + +var jsonOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web); +var datasetItems = LoadItems(); +var pgDataSource = OpenPgPool(); +var crudCache = new ConcurrentDictionary(); + +var plainServer = CreateServer(8080); +var tlsServer = CreateTlsServer(8081); + +if (tlsServer is null) +{ + await plainServer.RunAsync(); +} +else +{ + await Task.WhenAll(plainServer.RunAsync(), tlsServer.RunAsync()); +} + +return; + +SimpleWServer CreateServer(int port, SslContext? sslContext = null) +{ + var server = new SimpleWServer(IPAddress.Any, port) + .ConfigureJsonEngine(new SystemTextJsonEngine(_ => jsonOptions)) + .Configure(o => { + o.MaxRequestBodySize = 25 * 1024 * 1024; + o.TcpNoDelay = true; + o.ReuseAddress = true; + o.TcpKeepAlive = true; + o.AcceptPerCore = true; + o.ReusePort = true; + }); + + if (sslContext is not null) + { + server.UseHttps(sslContext); + } + + ConfigureRoutes(server); + return server; +} + +SimpleWServer? CreateTlsServer(int port) +{ + var certPath = Environment.GetEnvironmentVariable("TLS_CERT") ?? "/certs/server.crt"; + var keyPath = Environment.GetEnvironmentVariable("TLS_KEY") ?? "/certs/server.key"; + + if (!File.Exists(certPath) || !File.Exists(keyPath)) + { + return null; + } + + var certificate = X509Certificate2.CreateFromPemFile(certPath, keyPath); + var sslContext = new SslContext( + SslProtocols.Tls12 | SslProtocols.Tls13, + certificate, + clientCertificateRequired: false, + checkCertificateRevocation: false); + + return CreateServer(port, sslContext); +} + +void ConfigureRoutes(SimpleWServer server) +{ + if (Directory.Exists("/data/static")) + { + server.UseStaticFilesModule(options => { + options.Path = "/data/static"; + options.Prefix = "/static/"; + options.AutoIndex = false; + }); + } + + server.MapGet("/baseline11", (int a, int b, HttpSession s) => Text(s, a + b)); + server.MapPost("/baseline11", (int a, int b, HttpSession s) => Text(s, a + b + ParseInt(s.Request.Body))); + + server.MapGet("/baseline2", (int a, int b, HttpSession s) => Text(s, a + b)); + + server.MapGet("/pipeline", (HttpSession s) => s.Response.Text("ok")); + + server.MapPost("/upload", (HttpSession s) => Text(s, s.Request.Body.Length)); + + server.MapGet("/json/:count", (HttpSession s) => + JsonResponse(s, GetRouteInt(s, "count", 50), GetQueryInt(s, "m", 1))); + + // Kept for old probes and ad-hoc checks; official tests use /json/:count. + server.MapGet("/json", (HttpSession s) => JsonResponse(s, 50, GetQueryInt(s, "m", 1))); + + server.MapGet("/async-db", async (HttpSession s) => await AsyncDatabase(s)); + + server.MapGet("/crud/items", async (HttpSession s) => await CrudList(s)); + server.MapGet("/crud/items/:id", async (HttpSession s) => await CrudRead(s)); + server.MapPost("/crud/items", async (HttpSession s) => await CrudCreate(s)); + server.Map("PUT", "/crud/items/:id", async (HttpSession s) => await CrudUpdate(s)); + + server.UseWebSocketModule(ws => { + ws.OnBinary((conn, ctx, msg) => conn.SendBinaryAsync(msg)); + ws.OnUnknown((conn, ctx, msg) => conn.SendTextAsync(msg.RawText)); + }); +} + +HttpResponse Text(HttpSession session, long value) => session.Response.Text(value.ToString()); + +HttpResponse JsonResponse(HttpSession session, int count, int multiplier) +{ + if (datasetItems is null) + { + return session.Response.InternalServerError("Dataset not loaded"); + } + + count = Math.Clamp(count, 0, datasetItems.Count); + var processed = new List(count); + + for (var i = 0; i < count; i++) + { + var item = datasetItems[i]; + processed.Add(new ProcessedItem + { + Id = item.Id, + Name = item.Name, + Category = item.Category, + Price = item.Price, + Quantity = item.Quantity, + Active = item.Active, + Tags = item.Tags, + Rating = item.Rating, + Total = (long)item.Price * item.Quantity * multiplier + }); + } + + return session.Response + .Json(new ListWithCount(processed)) + .Compression(HttpResponse.ResponseCompressionMode.Auto, 0, CompressionLevel.Fastest); +} + +async Task AsyncDatabase(HttpSession session) +{ + if (pgDataSource is null) + { + return session.Response.Json(new ListWithCount([])); + } + + var min = GetQueryInt(session, "min", 10); + var max = GetQueryInt(session, "max", 50); + var limit = Math.Clamp(GetQueryInt(session, "limit", 50), 1, 50); + + await using var cmd = pgDataSource.CreateCommand( + "SELECT id, name, category, price, quantity, active, tags, rating_score, rating_count " + + "FROM items WHERE price BETWEEN $1 AND $2 LIMIT $3"); + + cmd.Parameters.AddWithValue(min); + cmd.Parameters.AddWithValue(max); + cmd.Parameters.AddWithValue(limit); + cmd.CommandTimeout = 2; + + await using var reader = await cmd.ExecuteReaderAsync(session.RequestAborted); + + var items = new List(limit); + + while (await reader.ReadAsync(session.RequestAborted)) + { + items.Add(ReadDbItem(reader)); + } + + return session.Response.Json(new ListWithCount(items)); +} + +async Task CrudList(HttpSession session) +{ + if (pgDataSource is null) + { + return session.Response.InternalServerError("Database not available"); + } + + var category = GetQueryString(session, "category", "electronics"); + var page = Math.Max(1, GetQueryInt(session, "page", 1)); + var limit = Math.Clamp(GetQueryInt(session, "limit", 10), 1, 50); + var offset = (page - 1) * limit; + + await using var cmd = pgDataSource.CreateCommand( + "SELECT id, name, category, price, quantity, active, tags, rating_score, rating_count " + + "FROM items WHERE category = $1 ORDER BY id LIMIT $2 OFFSET $3"); + + cmd.Parameters.AddWithValue(category); + cmd.Parameters.AddWithValue(limit); + cmd.Parameters.AddWithValue(offset); + cmd.CommandTimeout = 2; + + await using var reader = await cmd.ExecuteReaderAsync(session.RequestAborted); + + var items = new List(limit); + + while (await reader.ReadAsync(session.RequestAborted)) + { + items.Add(ReadDbItem(reader)); + } + + return session.Response.Json(new CrudListResponse + { + Items = items, + Total = items.Count, + Page = page, + Limit = limit + }); +} + +async Task CrudRead(HttpSession session) +{ + if (pgDataSource is null) + { + return session.Response.InternalServerError("Database not available"); + } + + var id = GetRouteInt(session, "id", 0); + var now = Environment.TickCount64; + + if (crudCache.TryGetValue(id, out var cached) && cached.ExpiresAt > now) + { + return session.Response + .AddHeader("X-Cache", "HIT") + .Body(cached.Body, "application/json"); + } + + crudCache.TryRemove(id, out _); + + var item = await FetchItemById(id, session.RequestAborted); + + if (item is null) + { + return session.Response.NotFound(); + } + + var body = JsonSerializer.SerializeToUtf8Bytes(item, jsonOptions); + crudCache[id] = new CrudCacheEntry(body, Environment.TickCount64 + 200); + + return session.Response + .AddHeader("X-Cache", "MISS") + .Body(body, "application/json"); +} + +async Task CrudCreate(HttpSession session) +{ + if (pgDataSource is null) + { + return session.Response.InternalServerError("Database not available"); + } + + var item = DeserializeBody(session); + + if (item is null) + { + return session.Response.Status(400).Text("Bad Request"); + } + + await using var cmd = pgDataSource.CreateCommand( + "INSERT INTO items (id, name, category, price, quantity, active, tags, rating_score, rating_count) " + + "VALUES ($1, $2, $3, $4, $5, true, '[\"bench\"]', 0, 0) " + + "ON CONFLICT (id) DO UPDATE SET name = $2, price = $4, quantity = $5 " + + "RETURNING id"); + + cmd.Parameters.AddWithValue(item.Id); + cmd.Parameters.AddWithValue(item.Name ?? "New Product"); + cmd.Parameters.AddWithValue(item.Category ?? "test"); + cmd.Parameters.AddWithValue(item.Price); + cmd.Parameters.AddWithValue(item.Quantity); + cmd.CommandTimeout = 2; + + item.Id = (int)(await cmd.ExecuteScalarAsync(session.RequestAborted))!; + crudCache.TryRemove(item.Id, out _); + + return session.Response.Status(201).Json(item); +} + +async Task CrudUpdate(HttpSession session) +{ + if (pgDataSource is null) + { + return session.Response.InternalServerError("Database not available"); + } + + var id = GetRouteInt(session, "id", 0); + var item = DeserializeBody(session); + + if (item is null) + { + return session.Response.Status(400).Text("Bad Request"); + } + + await using var cmd = pgDataSource.CreateCommand( + "UPDATE items SET name = $1, price = $2, quantity = $3 WHERE id = $4"); + + cmd.Parameters.AddWithValue(item.Name ?? "Updated"); + cmd.Parameters.AddWithValue(item.Price); + cmd.Parameters.AddWithValue(item.Quantity); + cmd.Parameters.AddWithValue(id); + cmd.CommandTimeout = 2; + + var affected = await cmd.ExecuteNonQueryAsync(session.RequestAborted); + + if (affected == 0) + { + return session.Response.NotFound(); + } + + crudCache.TryRemove(id, out _); + item.Id = id; + + return session.Response.Json(item); +} + +async Task FetchItemById(int id, CancellationToken cancellationToken) +{ + await using var cmd = pgDataSource!.CreateCommand( + "SELECT id, name, category, price, quantity, active, tags, rating_score, rating_count " + + "FROM items WHERE id = $1 LIMIT 1"); + + cmd.Parameters.AddWithValue(id); + cmd.CommandTimeout = 2; + + await using var reader = await cmd.ExecuteReaderAsync(cancellationToken); + + return await reader.ReadAsync(cancellationToken) ? ReadDbItem(reader) : null; +} + +DbItem ReadDbItem(NpgsqlDataReader reader) +{ + return new DbItem + { + Id = reader.GetInt32(0), + Name = reader.GetString(1), + Category = reader.GetString(2), + Price = reader.GetInt32(3), + Quantity = reader.GetInt32(4), + Active = reader.GetBoolean(5), + Tags = JsonSerializer.Deserialize>(reader.GetString(6), jsonOptions), + Rating = new RatingInfo { Score = reader.GetInt32(7), Count = reader.GetInt32(8) } + }; +} + +T? DeserializeBody(HttpSession session) +{ + try + { + return JsonSerializer.Deserialize(session.Request.BodyString, jsonOptions); + } + catch (JsonException) + { + return default; + } +} + +static List? LoadItems() +{ + var jsonOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web); + var datasetPath = Environment.GetEnvironmentVariable("DATASET_PATH") ?? "/data/dataset.json"; + + if (!File.Exists(datasetPath)) + { + datasetPath = "../../../../../data/dataset.json"; + } + + return File.Exists(datasetPath) + ? JsonSerializer.Deserialize>(File.ReadAllText(datasetPath), jsonOptions) + : null; +} + +static NpgsqlDataSource? OpenPgPool() +{ + var dbUrl = Environment.GetEnvironmentVariable("DATABASE_URL"); + + if (string.IsNullOrEmpty(dbUrl)) + { + return null; + } + + try + { + var uri = new Uri(dbUrl); + var userInfo = uri.UserInfo.Split(':'); + var maxConn = int.TryParse(Environment.GetEnvironmentVariable("DATABASE_MAX_CONN"), out var p) && p > 0 + ? p + : 256; + var minConn = Math.Min(64, maxConn); + var connStr = + $"Host={uri.Host};Port={uri.Port};Username={userInfo[0]};Password={userInfo[1]};Database={uri.AbsolutePath.TrimStart('/')};" + + $"Maximum Pool Size={maxConn};Minimum Pool Size={minConn};Multiplexing=true;No Reset On Close=true;Max Auto Prepare=20;Auto Prepare Min Usages=1"; + + return new NpgsqlDataSourceBuilder(connStr).Build(); + } + catch + { + return null; + } +} + +static int GetRouteInt(HttpSession session, string name, int fallback) +{ + if (session.Request.RouteValues is null) + { + return fallback; + } + + if (session.Request.RouteValues.TryGetValue(name, out var value) && + int.TryParse(value, out var parsed)) + { + return parsed; + } + + if (session.Request.RouteValues.TryGetValue($":{name}", out value) && + int.TryParse(value, out parsed)) + { + return parsed; + } + + return fallback; +} + +static int GetQueryInt(HttpSession session, string name, int fallback) +{ + return session.Request.Query.TryGetValue(name, out var value) && + int.TryParse(value, out var parsed) + ? parsed + : fallback; +} + +static string GetQueryString(HttpSession session, string name, string fallback) +{ + return session.Request.Query.TryGetValue(name, out var value) && !string.IsNullOrEmpty(value) + ? value + : fallback; +} + +static int ParseInt(ReadOnlySequence sequence) +{ + if (sequence.IsSingleSegment) + { + Utf8Parser.TryParse(sequence.FirstSpan, out int value, out _); + return value; + } + + Span buffer = stackalloc byte[(int)sequence.Length]; + sequence.CopyTo(buffer); + Utf8Parser.TryParse(buffer, out int value2, out _); + return value2; +} + +sealed record CrudCacheEntry(byte[] Body, long ExpiresAt); diff --git a/frameworks/simplew-tuned/README.md b/frameworks/simplew-tuned/README.md new file mode 100644 index 000000000..230542993 --- /dev/null +++ b/frameworks/simplew-tuned/README.md @@ -0,0 +1,31 @@ +# SimpleW + +SimpleW is Modern Web Server for .NET. Designed for Simplicity. Built for Speed. + +## Stack + +- **Language:** C# / .NET 10 +- **Framework:** SimpleW +- **Engine:** SimpleW +- **Build:** Self-contained musl publish, `runtime-deps:10.0-alpine` + +## Endpoints + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/pipeline` | GET | Returns `ok` (plain text) | +| `/baseline11` | GET | Sums query parameter values | +| `/baseline11` | POST | Sums query parameters + request body | +| `/baseline2` | GET | Sums query parameter values (HTTP/2 variant) | +| `/json/{count}?m=N` | GET | Processes the first `count` dataset items and computes `total = price * quantity * N` | +| `/async-db?min=X&max=Y&limit=N` | GET | Postgres range query with JSON response | +| `/crud/items` | GET/POST | Paginated list and create endpoint for the CRUD profile | +| `/crud/items/{id}` | GET/PUT | Cached read and cache-invalidating update endpoint | +| `/upload` | POST | Receives upload bodies up to 20 MB and returns the byte count | +| `/static/{filename}` | GET | Serves preloaded static files with MIME types | +| `/ws` | WS | Echo websocket endpoint | + +## Notes + +- Plain HTTP listens on `8080`. +- If `/certs/server.crt` and `/certs/server.key` are mounted, HTTPS for `json-tls` listens on `8081`. diff --git a/frameworks/simplew-tuned/meta.json b/frameworks/simplew-tuned/meta.json new file mode 100644 index 000000000..a0cf450ae --- /dev/null +++ b/frameworks/simplew-tuned/meta.json @@ -0,0 +1,26 @@ +{ + "display_name": "simplew-tuned", + "language": "C#", + "type": "tuned", + "engine": "simplew", + "description": "SimpleW is Modern Web Server for .NET. Designed for Simplicity. Built for Speed.", + "repo": "https://github.com/stratdev3/SimpleW", + "enabled": true, + "tests": [ + "baseline", + "pipelined", + "limited-conn", + "json", + "json-comp", + "json-tls", + "upload", + "static", + "async-db", + "crud", + "api-4", + "api-16", + "echo-ws", + "echo-ws-pipeline" + ], + "maintainers": [] +} \ No newline at end of file diff --git a/frameworks/simplew/simplew-bench.csproj b/frameworks/simplew-tuned/simplew.csproj similarity index 100% rename from frameworks/simplew/simplew-bench.csproj rename to frameworks/simplew-tuned/simplew.csproj diff --git a/frameworks/simplew/Dockerfile b/frameworks/simplew/Dockerfile index f7570f435..432489dc5 100644 --- a/frameworks/simplew/Dockerfile +++ b/frameworks/simplew/Dockerfile @@ -1,7 +1,7 @@ FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build WORKDIR /source -COPY simplew-bench.csproj ./ +COPY simplew.csproj ./ RUN dotnet restore COPY . . @@ -12,4 +12,4 @@ WORKDIR /app COPY --from=build /app . EXPOSE 8080 8081 -ENTRYPOINT ["dotnet", "simplew-bench.dll"] +ENTRYPOINT ["dotnet", "simplew.dll"] diff --git a/frameworks/simplew/Program.cs b/frameworks/simplew/Program.cs index a1fe392e4..33f0f6e79 100644 --- a/frameworks/simplew/Program.cs +++ b/frameworks/simplew/Program.cs @@ -38,11 +38,7 @@ SimpleWServer CreateServer(int port, SslContext? sslContext = null) .ConfigureJsonEngine(new SystemTextJsonEngine(_ => jsonOptions)) .Configure(o => { o.MaxRequestBodySize = 25 * 1024 * 1024; - o.TcpNoDelay = true; - o.ReuseAddress = true; - o.TcpKeepAlive = true; o.AcceptPerCore = true; - o.ReusePort = true; }); if (sslContext is not null) diff --git a/frameworks/simplew/README.md b/frameworks/simplew/README.md index bcf818e24..230542993 100644 --- a/frameworks/simplew/README.md +++ b/frameworks/simplew/README.md @@ -1,6 +1,6 @@ # SimpleW -SimpleW is Web server Library in .NET Core. Powerfully Simple and Blazingly Fast. +SimpleW is Modern Web Server for .NET. Designed for Simplicity. Built for Speed. ## Stack diff --git a/frameworks/simplew/meta.json b/frameworks/simplew/meta.json index 33754f7e4..f27cf8cf4 100644 --- a/frameworks/simplew/meta.json +++ b/frameworks/simplew/meta.json @@ -1,7 +1,7 @@ { "display_name": "simplew", "language": "C#", - "type": "tuned", + "type": "production", "engine": "simplew", "description": "SimpleW is Modern Web Server for .NET. Designed for Simplicity. Built for Speed.", "repo": "https://github.com/stratdev3/SimpleW", diff --git a/frameworks/simplew/simplew.csproj b/frameworks/simplew/simplew.csproj new file mode 100644 index 000000000..78b3f7ab9 --- /dev/null +++ b/frameworks/simplew/simplew.csproj @@ -0,0 +1,13 @@ + + + Exe + net10.0 + enable + true + enable + + + + + + From 87a3aa0aceac4789239987734308b0ee80d0f49a Mon Sep 17 00:00:00 2001 From: Christophe CHATEAU Date: Wed, 13 May 2026 00:07:41 +0200 Subject: [PATCH 2/2] fix project filename --- frameworks/simplew-tuned/Dockerfile | 4 ++-- .../simplew-tuned/{simplew.csproj => simplew-arena.csproj} | 0 frameworks/simplew/Dockerfile | 4 ++-- frameworks/simplew/{simplew.csproj => simplew-arena.csproj} | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename frameworks/simplew-tuned/{simplew.csproj => simplew-arena.csproj} (100%) rename frameworks/simplew/{simplew.csproj => simplew-arena.csproj} (100%) diff --git a/frameworks/simplew-tuned/Dockerfile b/frameworks/simplew-tuned/Dockerfile index 432489dc5..7444be429 100644 --- a/frameworks/simplew-tuned/Dockerfile +++ b/frameworks/simplew-tuned/Dockerfile @@ -1,7 +1,7 @@ FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build WORKDIR /source -COPY simplew.csproj ./ +COPY simplew-arena.csproj ./ RUN dotnet restore COPY . . @@ -12,4 +12,4 @@ WORKDIR /app COPY --from=build /app . EXPOSE 8080 8081 -ENTRYPOINT ["dotnet", "simplew.dll"] +ENTRYPOINT ["dotnet", "simplew-arena.dll"] diff --git a/frameworks/simplew-tuned/simplew.csproj b/frameworks/simplew-tuned/simplew-arena.csproj similarity index 100% rename from frameworks/simplew-tuned/simplew.csproj rename to frameworks/simplew-tuned/simplew-arena.csproj diff --git a/frameworks/simplew/Dockerfile b/frameworks/simplew/Dockerfile index 432489dc5..7444be429 100644 --- a/frameworks/simplew/Dockerfile +++ b/frameworks/simplew/Dockerfile @@ -1,7 +1,7 @@ FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build WORKDIR /source -COPY simplew.csproj ./ +COPY simplew-arena.csproj ./ RUN dotnet restore COPY . . @@ -12,4 +12,4 @@ WORKDIR /app COPY --from=build /app . EXPOSE 8080 8081 -ENTRYPOINT ["dotnet", "simplew.dll"] +ENTRYPOINT ["dotnet", "simplew-arena.dll"] diff --git a/frameworks/simplew/simplew.csproj b/frameworks/simplew/simplew-arena.csproj similarity index 100% rename from frameworks/simplew/simplew.csproj rename to frameworks/simplew/simplew-arena.csproj