# 更新日志

Source: https://docs.sisk-framework.org/zh-cn/docs/changelogs.html

每一次对 Sisk 的更改都记录在更新日志中。您可以在[此处](https://github.com/sisk-http/archive/tree/master/changelogs)查看所有 Sisk 版本的更新日志。

## 从 1.6 迁移到 1.7

Sisk 1.7.0 包含 `Sisk.HttpServer`、`Sisk.Cadente`、`Sisk.Cadente.CoreEngine` 和 `Sisk.IniConfiguration` 1.7.0。`Sisk.Documenting`、`Sisk.Documenting.Html` 和 `Sisk.Monitoring` 以 1.7.0-rc3 发行，`Sisk.ModelContextProtocol` 为 1.7.0-rc1。请阅读[完整的 1.7.0 更新日志](https://github.com/sisk-http/archive/blob/master/changelogs/core/v1.7/v1.7.0.md)了解所有更改。

### 破坏性更改

- **`Route.UseRegex` 不能再被设置。** 此属性已废弃，仅用于报告路由是否为 `RegexRoute`。请改为创建一个 [RegexRoute](https://docs.sisk-framework.org/api/Sisk.Core.Routing.RegexRoute.md)。带有 `UseRegex = true` 的路由属性和 `[RegexRoute]` 特性仍然可用。参见[正则路由](https://docs.sisk-framework.org/zh-cn/docs/fundamentals/routing.md#regex-routes)。

    ```cs
    // 之前
    router.Map(new Route(RouteMethod.Get, @"^/items/(?<id>\d+)$", action) { UseRegex = true });

    // 之后
    router.Map(new RegexRoute(RouteMethod.Get, @"^/items/(?<id>\d+)$", action));
    ```

- **请求体默认限制为 100 MB。** [HttpServerConfiguration.MaximumContentLength](https://docs.sisk-framework.org/api/Sisk.Core.Http.HttpServerConfiguration.MaximumContentLength.md) 的默认值已从 `0`（无限制）改为 100 MB。此限制同样适用于请求流和 WebSocket 消息。将其设为 `0` 可恢复之前的行为。参见[获取请求体](https://docs.sisk-framework.org/zh-cn/docs/fundamentals/requests.md#getting-the-request-body)。

    ```cs
    using var app = HttpServer.CreateBuilder()
        .UseConfiguration(config => config.MaximumContentLength = 0)
        .Build();
    ```

- **静态路由在动态路由之前进行匹配。** 正则路由、前缀路由（包括文件服务器）以及自定义匹配路由会在每个静态路由之后进行测试，且不受注册顺序影响。参见[匹配优先级](https://docs.sisk-framework.org/zh-cn/docs/fundamentals/routing.md#matching-precedence)。

- **重复的路由名称将在启动时抛出异常。** 当服务器启动时，如果有两个或以上具有相同 `Name` 的路由，将触发 `ArgumentException`，前提是已启用 [Router.CheckForRouteCollisions](https://docs.sisk-framework.org/api/Sisk.Core.Routing.Router.CheckForRouteCollisions.md)（默认开启）。

- **文件服务器路由是前缀路由。** `Router.MapFileSystem` 和 `HttpFileServer.CreateServingRoute` 会创建一个 [PrefixRoute](https://docs.sisk-framework.org/api/Sisk.Core.Routing.PrefixRoute.md) 而非正则路由，并且不再受 `ForceTrailingSlash` 的影响。

- **`RouteMethod.Any` 包含 `QUERY`。** 使用 `MapAny` 映射的路由同样会响应 `QUERY` 请求。`RouteMethod.Any` 的数值已更改，请重新编译使用或比较该值的代码。

- **CORS 预检遵循 `UseCors`。** 自动的 `OPTIONS` 响应不再为 `UseCors = false` 的路由发送 CORS 头部，而显式映射的 `OPTIONS` 路由会自行处理该请求。参见[预检请求](https://docs.sisk-framework.org/zh-cn/docs/features/cors.md#preflight-requests)。

- **Cadente 拒绝格式错误的请求。** 无效的请求方法和目标、不受支持的 `Transfer-Encoding` 值以及冲突的 `Content-Length` 头部都会被拒绝，且大于 8 KB 的头部块会返回 `431 Request Header Fields Too Large`。参见[Cadente 请求验证](https://docs.sisk-framework.org/zh-cn/docs/cadente.md#request-validation)。

### 已停止维护的包

`Sisk.BasicAuth`、`Sisk.SslProxy` 和 `Sisk.ServiceProvider` 已不再维护，并在 NuGet 上标记为已弃用，且没有替代包。请从项目中移除它们：

- 用您自己的[请求处理程序](https://docs.sisk-framework.org/zh-cn/docs/fundamentals/request-handlers.md)替代 `Sisk.BasicAuth`，自行验证 `Authorization` 头部。
- 用 [Cadente 引擎](https://docs.sisk-framework.org/zh-cn/docs/cadente.md) 的原生 SSL 支持替代 `Sisk.SslProxy`。
- 用 `Sisk.HttpServer` 通过 `UsePortableConfiguration` 内置的[可移植配置](https://docs.sisk-framework.org/zh-cn/docs/extensions/service-providers.md)替代 `Sisk.ServiceProvider`。

### 新特性

- 通过 `Route.Match`、`RouteMatch`、`Route.IsStatic` 和 `Route.AllowRewrites` 实现[自定义路由匹配](https://docs.sisk-framework.org/zh-cn/docs/fundamentals/routing.md#custom-route-matching)，以及新的[前缀路由](https://docs.sisk-framework.org/zh-cn/docs/fundamentals/routing.md#prefix-routes)。
- 支持 HTTP [QUERY 方法](https://docs.sisk-framework.org/zh-cn/docs/fundamentals/routing.md#query-method-routes)，使用 `MapQuery`、`Route.Query`、`[RouteQuery]` 和 `Accept-Query` 头部。
- 通过 `HttpContext.Interlocked` 实现[原子上下文值](https://docs.sisk-framework.org/zh-cn/docs/fundamentals/requests.md#atomic-context-values)。
- `%{$key}` [访问日志项](https://docs.sisk-framework.org/zh-cn/docs/features/logging.md#access-log-formatting)，用于打印请求包的值；以及[安全文件写入帮助方法](https://docs.sisk-framework.org/zh-cn/docs/features/logging.md#writing-files-safely) `LogStream.SafeWriteToFile` 和 `LogStream.SafeAppendToFile`。
- 在 Cadente 中：管道化的 keep-alive 请求、`WriteInlineContent` 与 `WriteInlineContentAsync`，以及对在 SSL 端口上收到的普通 HTTP 请求进行 HTTPS 重定向。
- 在扩展中：参数示例和 `LlmsApiExporter.FooterText`（位于 [Sisk.Documenting](https://docs.sisk-framework.org/zh-cn/docs/extensions/api-documentation.md)），技能以及 `2026-07-28` 协议修订（位于 [Sisk.ModelContextProtocol](https://docs.sisk-framework.org/zh-cn/docs/extensions/mcp.md)），以及在 Sisk.Monitoring 仪表盘中的 HTTP 流量、延迟、路由和异常遥测。

### 其他行为更改

- `HttpListener` 引擎会将每个请求分派到线程池，因此慢请求不再阻塞下一个接受的连接。其 `ContextAbortedToken` 现在返回 `CancellationToken.None` 而不是抛出异常。
- 在请求结束时以及写入日志时，由服务器处理程序抛出的异常会写入错误日志，而不是逃逸到 HTTP 引擎。参见[处理程序抛出的异常](https://docs.sisk-framework.org/zh-cn/docs/advanced/http-server-handlers.md#exceptions-thrown-by-handlers)。
- 当允许的来源取决于请求时，CORS 响应会发送 `Vary: Origin`。
- `%ri` 访问日志项使用请求开始时解析的客户端地址。
- `Sisk.HttpServer` 目标为 .NET 8、.NET 9 和 .NET 10。`Sisk.Cadente` 与 `Sisk.Cadente.CoreEngine` 目标为 .NET 9 和 .NET 10，并将其调试符号以 `.snupkg` 包形式发布。
