AyCode.Core/AyCode.Services/Mvc/README.md

2.2 KiB

Mvc

⚠️ TEMPORARILY DISABLED — formatter sources block-commented (/* ... */) and Microsoft.AspNetCore.App FrameworkReference removed from AyCode.Services.csproj (downstream net10.0 Hybrid client conflict on Microsoft.AspNetCore.Mvc namespace). Re-enable when split into a separate NuGet package / solution. Description below documents the intended state.

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 via PipeReader.Create(Request.Body), drains chunks into AsyncPipeReaderInput on the calling thread while a background Task.Run deserializes incrementally via AcBinaryDeserializer.Deserialize(input, ModelType, opts). ProblemDetails error flow on failure (ModelState.TryAddModelError → 400 + application/problem+json). Cancellation honors HttpContext.RequestAborted.
  • AcBinaryOutputFormatter.cs — Wraps Response.Body as PipeWriter, calls AcBinarySerializer.SerializeChunked(Object, ObjectType, writer, opts) (raw mode — pure AcBinary bytes, no per-chunk framing). pipeWriter.CompleteAsync() in finally.
  • AcBinaryMvcBuilderExtensions.csIMvcBuilder.AddAcBinaryFormatters(...) + IMvcCoreBuilder.AddAcBinaryFormatters(...). Inserts both formatters at index 0 of MvcOptions.InputFormatters / OutputFormatters so AcBinary is preferred when the client's Accept header 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.ReadAsyncinput.Feed). The serializer surface ends at AsyncPipeReaderInputAcBinaryDeserializer itself does not know about PipeReader. This mirrors the SignalR pattern (AcBinaryHubProtocol.TryParseChunkData does the same state.Buffer.Write(span)-loop).