Sisk

手动(高级)设置

本页由英文自动翻译。 阅读原文

当需要自行组装服务器各部件时(例如一个进程必须暴露多个主机、端口、路由器或自定义服务器配置),请使用手动设置。对于大多数应用,构建器 API 更简洁且应当优先使用。手动设置在需要直接控制四个核心部件时非常有用:Router、一个或多个 ListeningHost 对象、HttpServerConfiguration,以及最终的 HttpServer。

首先,我们需要了解请求/响应的概念。它非常简单:每个请求必须有一个响应。Sisk 也遵循这一原则。让我们创建一个方法,以 HTML 返回 “Hello, World!” 消息,并指定状态码和头部。

C#
// Program.cs
using Sisk.Core.Http;
using Sisk.Core.Routing;

static HttpResponse IndexPage(HttpRequest request)
{
    HttpResponse indexResponse = new HttpResponse
    {
        Status = System.Net.HttpStatusCode.OK,
        Content = new HtmlContent(@"
            <html>
                <body>
                    <h1>Hello, world!</h1>
                </body>
            </html>
        ")
    };

    return indexResponse;
}

下一步是将此方法关联到一个 HTTP 路由。

路由器 #

路由器是请求路由的抽象,充当请求与响应之间的桥梁。路由器管理服务路由、函数和错误。

一个路由器可以拥有多条路由,每条路由可以在该路径上执行不同的操作,例如调用函数、提供页面或返回服务器资源。

让我们创建第一个路由器,并将 IndexPage 方法关联到根路径。

C#
Router mainRouter = new Router();

mainRouter.MapGet("/", IndexPage);

现在我们的路由器可以接收请求并发送响应。但 mainRouter 并未绑定到主机或服务器,单独使用时不会工作。接下来创建我们的 ListeningHost。

监听主机和端口 #

一个 ListeningHost 可以托管一个路由器,并为同一路由器提供多个监听端口。一个 ListeningPort 是 HTTP 服务器将监听的前缀。

这里,我们可以创建一个指向两个端点的 ListeningHost:

C#
ListeningHost myHost = new ListeningHost
{
    Router = mainRouter,
    Ports = new ListeningPort[]
    {
        new ListeningPort("http://localhost:5000/")
    }
};

现在我们的 HTTP 服务器将监听指定的端点,并将请求转发给我们的路由器。

服务器配置 #

服务器配置负责大部分 HTTP 服务器本身的行为。在此配置中,我们可以将 ListeningHosts 与服务器关联。

C#
HttpServerConfiguration config = new HttpServerConfiguration();
config.ListeningHosts.Add(myHost); // 将我们的 ListeningHost 添加到此服务器配置

常用服务器配置选项:

属性默认值使用场景备注
RemoteRequestsActionRequestListenAction.Accept服务应拒绝非本地请求,除非它们通过受信任的反向代理。仅在部署拓扑明确时才将其设为 Drop。
IncludeRequestIdHeaderfalse客户端或代理需要在 X-Request-Id 响应头中包含 Sisk 请求 ID。请配合包含 HttpRequest.RequestId 的日志使用。
IdleConnectionTimeout120 seconds空闲的 Keep-Alive 连接应在适当时机关闭。此行为由 HTTP 引擎实现。
NormalizeHeadersEncodingsfalse收到的头部存在编码不匹配。此操作会增加处理开销,除非必要请保持禁用。
SendSiskHeadertrue您希望隐藏或显示 X-Powered-By Sisk 头部。在更严格的生产环境头部策略下请禁用。
OptionsLogModeLogOutput.Both您希望减少或重定向自动 OPTIONS 处理产生的日志。使用与路由相同的日志模式值。
AsyncRequestProcessingtrue您需要确定性的单请求处理以便诊断。禁用后会限制吞吐量。
DisposeDisposableContextValuestrue实现 IDisposable 的请求袋值应自动释放。除非在其他地方管理所有权,否则请保持启用。
ConvertIAsyncEnumerableIntoEnumerabletrue值处理程序应将异步可枚举对象作为阻塞的可枚举值接收。如果您自行实现异步流处理,请禁用此功能。
KeepAlivetrue响应后连接应保持可复用。对于不善于处理持久连接的客户端或中间件,请禁用。
ForceTrailingSlashfalseGET 路由应重定向到带尾随斜杠的 URL。仅适用于非正则表达式路由。
MaximumContentLength100 MB请求体或 WebSocket 消息需要不同的大小限制。在 Sisk 1.7 之前默认是 0(无限制)。将其设为 0 可移除限制。
EnableAutomaticResponseCompressionfalse当客户端支持时,响应应自动压缩。已有的 CompressedContent 响应不会再次压缩。

接下来,我们可以创建 HTTP 服务器:

C#
HttpServer server = new HttpServer(config);
server.Start();    // 启动服务器
Console.ReadKey(); // 防止应用程序退出

现在我们可以编译可执行文件,并使用以下命令运行 HTTP 服务器:

Bash
dotnet watch

运行时,打开浏览器并访问服务器路径,你应该会看到:

输入关键词以搜索文档和 API 参考。