2.66.4

(fix): Dynamic snippets now render path-parameter arguments in IR (URL / SDK signature) order rather than in the order they happen to appear in the input request, so generated examples line up with the actual SDK method signature even when the spec lists path parameters in a different order.


2.66.3

(fix): Bump WireMock.Net from 2.2.0 to 2.6.0 in generated test projects to resolve Snyk vulnerability reports flagging the older version.


2.66.2

(chore): Patch C# SDK generator container CVEs flagged in the AWS ECR / grype scan. Switch the apk upgrade to pick up the latest Alpine 3.23 patches (nghttp2, openssl, libcrypto, libssl, sqlite-libs, expat, etc.), pin a non-vulnerable set of System.* NuGet dependencies, drop the bundled PowerShell warmup so its vendored System.Net.Http 4.3.0 / System.Security.Cryptography.Xml DLLs are no longer included in the published image, and clear the System.Net.Http 4.3.0 artifact the /dependencies.csproj warmup leaves in the NuGet cache after restore.


2.66.1

(chore): Bump the C# SDK and C# model generator containers’ Node base image from node:22.22-alpine3.23 to node:24.15-alpine3.23. Aligns the generators with the rest of the Fern generator containers on a single Node major version (Node 24) and picks up Node 24’s CVE patches. The bundled npm 11.12.1 in node:24.15 already ships patched brace-expansion@5.0.4, so the C# SDK’s brace-expansion 2.0.3 replacement step is removed. The ip-address and picomatch patches are retained because the bundled versions in node:24.15 (10.1.0 and 4.0.3 respectively) are still vulnerable.


2.66.0

(feat): Add a default-timeout-in-seconds config option to the C# SDK generator. When set, the generated ClientOptions.Timeout defaults to the configured value (or Timeout.InfiniteTimeSpan when set to "infinity") instead of the previously hardcoded 30 seconds. SDK users can still override the timeout per-request via RequestOptions.Timeout.

(feat): Add an opt-in user-agent-name-from-package custom config option. When set to true, the generated client falls back to a <NuGetPackageId>/<version> User-Agent header when no platformHeaders.userAgent is set in the IR (e.g. for SDKs imported from OpenAPI), matching the TypeScript generator’s npm-package-name fallback. Defaults to false, preserving the existing behavior of emitting no User-Agent header in that case.


2.65.2

(chore): Bump generator container Node.js base image to node:22.22-alpine3.23 and apply latest Alpine package security updates at build time.

2.65.1

(chore): Patch the C# SDK generator container to remediate the 40 vulnerabilities reported by the 2026-05-06 grype scan. Bump the Node.js base image to 22.22.2-alpine3.22 (fixes Node binary CVEs and upgrades npm-bundled cross-spawn, minimatch, glob, tar, and diff), remove the unused PowerShell install bundled with dotnet/sdk:10.0-alpine to drop the vulnerable System.Security.Cryptography.Xml 10.0.5 DLL flagged by GHSA-37gx-xxp4-5rgx and GHSA-w3x6-4m5h-cxqf, run apk upgrade to pick up the nghttp2-libs CVE-2026-27135 fix, and patch npm’s bundled ip-address (10.1.1), picomatch (4.0.4), and brace-expansion (2.0.3).


2.65.0

(feat): Generate CONTRIBUTING.md for C# SDKs, matching the pattern used by the TypeScript generator. The file is skipped for whitelabel SDKs.

2.64.2

(fix): Dedup auth-derived headers in the generated client constructor when multiple auth schemes resolve to the same HTTP header name (for example, an oauth2 bearer scheme plus an apiKey-in-header scheme both named Authorization). Previously the constructor’s Dictionary<string, string> collection initializer added the same key twice and threw System.ArgumentException: An item with the same key has already been added at runtime. Earlier auth schemes win, preserving the ordering established by the IR.

(fix): Fix literal boolean auth-header values being emitted as "True" regardless of the configured value. The generated client constructor’s auth-header dictionary tested the truthiness of the Literal discriminated-union object instead of reading its boolean field, so a literal false header incorrectly produced "True".


2.64.1

(fix): Fix namespace collision when referencing nested discriminated union variant types in generated test code. When the enclosing type name matches a segment of the test file’s namespace, the C# compiler resolves it as the namespace instead of the SDK type (CS0234). Now emits fully qualified type references in this case.

(fix): Fix OneOfSerializer to prefer strongly-typed deserialization over catch-all matches. When a discriminated union type inside a OneOf uses a catch-all for unknown discriminators, the serializer now tries all types and selects the best match instead of returning the first success.

(fix): Fix serialization round-trip tests to account for WhenWritingNull normalization. The Roundtrips test now verifies idempotency of the serialized form rather than comparing against the raw input JSON, which may include null optional properties that are intentionally omitted by the serializer.

2.64.0

(feat): Add retryStatusCodes config with "legacy" and "recommended" modes. Legacy (default) preserves current behavior (408, 429, >= 500). Recommended retries only transient codes (408, 429, 502, 503, 504), avoiding idempotency issues with 500. A 3.0.0 migration auto-pins legacy for upgrading users.

2.63.3

(fix): Fix dynamic snippets emitting wrong property name when PascalCase(property) collides with class name (e.g. CatalogV1Id.catalog_v1_id). The snippet generator now uses the same rename logic as the SDK (appending ”_”) so that generated examples compile without CS0542 / CS0117 errors.


2.63.2

(fix): Fix multi-value query parameter snippets when the example value is already a list, which previously produced uncompilable list-of-list initializers like [new List<T>() { value }] in mock server tests, reference docs, and snippets.

2.63.1

(fix): Fix WireMock test generation to use percent-encoded query parameter keys, matching what spec-compliant HTTP clients send. Also split comma-delimited query parameter examples into multiple values in a single WithParam() call, since WireMock.Net parses comma-separated values into arrays.


2.63.0

(feat): Support x-fern-default as fallback value for parameters in generated C# SDKs. When a header, query parameter, or path parameter has a clientDefault value in the IR, the generated C# SDK makes that parameter optional with the default value automatically applied.