> For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://buildwithfern.com/learn/llms.txt.

## 2.34.0

**`(feat):`** 添加 `unified-client-options` 配置标志。启用时，所有认证参数、
全局头部和 `BaseUrl` 都合并到 `ClientOptions` 中，使客户端
构造函数采用单一参数，无需位置参数：

```yaml
# generators.yml
groups:
  dotnet-sdk:
    generators:
      - name: fernapi/fern-csharp-sdk
        config:
          unified-client-options: true
```

**之前** (默认)：

```csharp
var client = new MyClient(
    "my-api-key",
    clientOptions: new ClientOptions { BaseUrl = "..." }
);
```

**之后** (启用 `unified-client-options: true`)：

```csharp
var client = new MyClient(
    new ClientOptions
    {
        ApiKey = "my-api-key",
        BaseUrl = "https://api.example.com",
    }
);
```

支持的认证方案：bearer token、基本认证 (用户名/密码)、header 认证、
OAuth 客户端凭据 (clientId/clientSecret + 自定义参数) 和推断认证。
全局头部 (非字面量) 也包括在内。

`ClientOptions` 的属性根据参数的特性使用适当的 C# 语义：

* **有环境变量回退** — `public string? ApiKey { get; set; }`。
  可空且可变，以便构造函数可以通过
  `clientOptions.ApiKey ??= GetFromEnvironmentOrThrow(...)` 应用回退。
* **可选 (无环境变量)** — `public string? ApiKey { get; init; }`。
  可空，构造后不可变。
* **必需 (无环境变量，非可选)** — `public required string ApiKey { get; init; }`。
  不可空，编译器在调用处强制执行。当没有配置默认环境时，`BaseUrl` 也是
  `required`，替代之前静默默认为 `""` 的行为。

当任何 `ClientOptions` 字段是 `required` 时，构造函数参数变为
不可空 (`ClientOptions clientOptions` 而不是 `ClientOptions? clientOptions = null`)，
并且 `Clone()` 使用带有 `[SetsRequiredMembers]` 注解的内部复制构造函数。

## 2.33.1

**`(fix):`** 修复 README 生成，使用 `generator.yml` 中的 `package-name` 字段作为
安装说明和徽章中的 NuGet 包名称。之前，README
始终使用命名空间 (或 `package-id` 自定义配置) 而不是配置的
`package-name`，而后者是实际的 NuGet 包标识符。

## 2.33.0

**`(feat):`** WebSocket 工厂方法现在当通道指定 `baseUrl` 时，从主客户端的
多 URL 环境解析基础 URL。这允许
WebSocket 客户端使用在根客户端定义的环境 (例如，
`Environment.Wss`) 而不需要单独的每个 WebSocket 环境
类。

## 2.32.2

**`(fix):`** 修复在 `netstandard2.0` 和
`net462` 目标上字面量结构 `GetHashCode` 的 CS1501 构建错误。`string.GetHashCode(StringComparison)` 仅在
.NET Core 2.1+ / .NET Standard 2.1+ 中可用。生成的代码现在使用
`StringComparer.Ordinal.GetHashCode(Value)`，它在所有框架上都可用。

## 2.32.1

**`(fix):`** 修复具有 `application/x-www-form-urlencoded` 内容类型的引用请求体
生成 `FormRequest` 而不是 `JsonRequest`。之前，使用带有表单 URL 编码内容类型的
`$ref` 模式的端点会错误地发送 JSON 序列化的
请求体，导致认证令牌请求 (例如 OAuth) 失败。