Add docs for AcBinary MVC formatters and pipeline updates Comprehensive documentation for new ASP.NET Core MVC formatters supporting AcBinary, including registration, media type, request/response flow, error handling, and future plans. Updated project and topic docs to reference MVC formatters and folder structure. Added performance planning entry for StreamPipeWriter congestion fallback. Expanded markerless schema lane rationale and updated architecture docs to reflect MVC formatter integration. Improved navigation and layering documentation. |
||
|---|---|---|
| .. | ||
| AcBinaryInputFormatter.cs | ||
| AcBinaryMvcBuilderExtensions.cs | ||
| AcBinaryOutputFormatter.cs | ||
| README.md | ||
README.md
Mvc
ASP.NET Core MVC formatters for AcBinary wire format. Standard MVC pipeline integration — works with both controller-based MVC and Minimal API.
Topic docs:
AyCode.Services/docs/MVC/README.md— media type, request/response flow, configuration, ProblemDetails error model. Binary serializer:../../AyCode.Core/AyCode.Core/docs/BINARY/README.md
Key Files
AcBinaryInputFormatter.cs— Reads request body viaPipeReader.Create(Request.Body), drains chunks intoAsyncPipeReaderInputon the calling thread while a backgroundTask.Rundeserializes incrementally viaAcBinaryDeserializer.Deserialize(input, ModelType, opts). ProblemDetails error flow on failure (ModelState.TryAddModelError→ 400 +application/problem+json). Cancellation honorsHttpContext.RequestAborted.AcBinaryOutputFormatter.cs— WrapsResponse.BodyasPipeWriter, callsAcBinarySerializer.SerializeChunked(Object, ObjectType, writer, opts)(raw mode — pure AcBinary bytes, no per-chunk framing).pipeWriter.CompleteAsync()in finally.AcBinaryMvcBuilderExtensions.cs—IMvcBuilder.AddAcBinaryFormatters(...)+IMvcCoreBuilder.AddAcBinaryFormatters(...). Inserts both formatters at index 0 ofMvcOptions.InputFormatters/OutputFormattersso AcBinary is preferred when the client'sAcceptheader allows.
Media Type
application/vnd.acbinary (vendor tree). Configurable per-instance via SupportedMediaTypes.Add(...) if a different type is needed.
Layering
The formatter owns the transport-specific drain-loop (PipeReader.ReadAsync → input.Feed). The serializer surface ends at AsyncPipeReaderInput — AcBinaryDeserializer itself does not know about PipeReader. This mirrors the SignalR pattern (AcBinaryHubProtocol.TryParseChunkData does the same state.Buffer.Write(span)-loop).