Reason-phrase reproduction ========================== ASP.NET Core / Kestrel sets a custom HTTP/1.1 reason phrase on the status line. We need that phrase to survive to the client. GET /reason-phrase -> sends: HTTP/1.1 401 ActivationNotFound GET /reason-phrase/{phrase} -> sends: HTTP/1.1 401 {phrase} GET /ok-phrase -> sends: HTTP/1.1 200 EverythingIsFine GET /echo -> what the container sees GET /health -> ok Compare the first line of the response: curl -i -s https:///reason-phrase | head -1 Expected (and what the container sends): HTTP/1.1 401 ActivationNotFound Observed through the platform router: HTTP/1.1 401 Unauthorized Why it matters: a desktop application in the field reads HttpWebResponse.StatusDescription to decide which error occurred. Those clients are installed on customer machines and cannot be updated, so the phrase is a fixed part of the contract.