[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-migrating-mvc-httpcontext":3,"mdc--ea0kg7-key":35,"related-repo-microsoft-migrating-mvc-httpcontext":2786,"related-org-microsoft-migrating-mvc-httpcontext":2882},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":33,"mdContent":34},"migrating-mvc-httpcontext","migrate ASP.NET HttpContext to Core","Migrates ASP.NET Framework HttpContext, Request, and Response usage to ASP.NET Core equivalents. Use when projects reference HttpContext.Current, HttpRequest.InputStream, HttpResponse.Write, HttpServerUtility, Request.ServerVariables, Request.Files, Response.End, Response.AddHeader, or ClaimsPrincipal.Current. Also triggers for \"replace HttpContext.Current\", \"inject IHttpContextAccessor\", \"async response writing\", \"request body reading\", or when assessment signals include UsesHttpContextCurrent, UsesHttpContext, UsesResponseWrite, UsesRequestInputStream, UsesCustomHeaders.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Modernization","modernization","tag",{"name":17,"slug":18,"type":15},"Backend","backend",{"name":20,"slug":21,"type":15},".NET","net",{"name":23,"slug":24,"type":15},"Migration","migration",7,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fupgrade-agent-plugins","2026-07-07T06:52:31.442593",null,1,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":28},[],"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fupgrade-agent-plugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fupgrade-agent\u002Fextenders\u002Fupgrade-dotnet\u002Fupgrade\u002Fskills\u002Flazy\u002Fweb\u002Fmvc\u002Fmigrating-mvc-httpcontext","---\r\nname: migrating-mvc-httpcontext\r\ndescription: >\r\n  Migrates ASP.NET Framework HttpContext, Request, and Response usage to ASP.NET Core equivalents.\r\n  Use when projects reference HttpContext.Current, HttpRequest.InputStream, HttpResponse.Write,\r\n  HttpServerUtility, Request.ServerVariables, Request.Files, Response.End, Response.AddHeader,\r\n  or ClaimsPrincipal.Current. Also triggers for \"replace HttpContext.Current\", \"inject\r\n  IHttpContextAccessor\", \"async response writing\", \"request body reading\", or when assessment\r\n  signals include UsesHttpContextCurrent, UsesHttpContext, UsesResponseWrite,\r\n  UsesRequestInputStream, UsesCustomHeaders.\r\nmetadata:\r\n  traits: .NET|CSharp|VisualBasic|DotNetCore\r\n  discovery: lazy\r\n---\r\n\r\n# ASP.NET MVC HttpContext and Request\u002FResponse Migration\r\n\r\n## Overview\r\n\r\nMigrate `HttpContext.Current`, `HttpRequest`, `HttpResponse`, and `HttpServerUtility` usage from ASP.NET Framework to ASP.NET Core. The static `HttpContext.Current` accessor is removed in Core — all context access flows through dependency injection or controller base class properties. Response writing is async-only in Kestrel, and request reading APIs have changed types and behavior.\r\n\r\n> **Adapter precedence**: If the `aspnet-system-web-adapters` skill is loaded, its guidance takes precedence over HttpContext.Current, Request Access, Response Access, and ClaimsPrincipal.Current sections during scaffold and migrate task phases.\r\n\r\n## Workflow\r\n\r\nTrack progress across these steps:\r\n\r\n```\r\nMigration Progress:\r\n- [ ] Step 1: Inventory HttpContext usage patterns\r\n- [ ] Step 2: Eliminate HttpContext.Current\r\n- [ ] Step 3: Migrate request access patterns\r\n- [ ] Step 4: Migrate response access patterns\r\n- [ ] Step 5: Replace HttpServerUtility calls\r\n- [ ] Step 6: Migrate ClaimsPrincipal.Current\r\n- [ ] Step 7: Remove legacy references\r\n```\r\n\r\n### Step 1: Inventory HttpContext Usage Patterns\r\n\r\nScan the project for all HttpContext-related usage:\r\n\r\n- `HttpContext.Current` — static access in controllers, services, libraries, and helpers\r\n- `HttpContext.Current.Request` \u002F `.Response` — direct request\u002Fresponse property access\r\n- `HttpContext.Current.Server` — `HttpServerUtility` calls (`MapPath`, `HtmlEncode`, `UrlEncode`)\r\n- `HttpContext.Current.User` \u002F `ClaimsPrincipal.Current` — identity access\r\n- `HttpContext.Current.Items` — per-request storage\r\n- `Request.InputStream`, `Request.Files`, `Request.ServerVariables` — changed APIs\r\n- `Response.Write()`, `Response.End()`, `Response.AddHeader()` — removed or changed methods\r\n\r\nCategorize each usage site by location: controller, service\u002Flibrary, middleware, or static helper. Location determines the migration strategy.\r\n\r\n### Step 2: Eliminate HttpContext.Current\r\n\r\n`HttpContext.Current` does not exist in ASP.NET Core. The replacement depends on where the access occurs.\r\n\r\n**In controllers** — use the `HttpContext` property directly:\r\n\r\nBefore:\r\n```csharp\r\npublic class ProductController : Controller\r\n{\r\n    public ActionResult Index()\r\n    {\r\n        var userId = HttpContext.Current.User.Identity.Name;\r\n        HttpContext.Current.Items[\"LastAccess\"] = DateTime.UtcNow;\r\n        return View();\r\n    }\r\n}\r\n```\r\n\r\nAfter:\r\n```csharp\r\npublic class ProductController : Controller\r\n{\r\n    public IActionResult Index()\r\n    {\r\n        var userId = HttpContext.User.Identity?.Name;\r\n        HttpContext.Items[\"LastAccess\"] = DateTime.UtcNow;\r\n        return View();\r\n    }\r\n}\r\n```\r\n\r\n**In services and libraries** — inject `IHttpContextAccessor`:\r\n\r\nBefore:\r\n```csharp\r\npublic class AuditService\r\n{\r\n    public string GetCurrentUser()\r\n    {\r\n        return HttpContext.Current.User.Identity.Name;\r\n    }\r\n}\r\n```\r\n\r\nAfter:\r\n```csharp\r\npublic class AuditService\r\n{\r\n    private readonly IHttpContextAccessor _httpContextAccessor;\r\n\r\n    public AuditService(IHttpContextAccessor httpContextAccessor)\r\n    {\r\n        _httpContextAccessor = httpContextAccessor;\r\n    }\r\n\r\n    public string GetCurrentUser()\r\n    {\r\n        return _httpContextAccessor.HttpContext?.User.Identity?.Name ?? string.Empty;\r\n    }\r\n}\r\n```\r\n\r\nRegister the accessor in `Program.cs`:\r\n```csharp\r\nbuilder.Services.AddHttpContextAccessor();\r\n```\r\n\r\n> **Threading concern**: `IHttpContextAccessor` uses `AsyncLocal\u003CT>`. In singleton services, always access `.HttpContext` at call time — never cache the `HttpContext` reference in a field. A cached reference may belong to a completed request and produce null-reference or cross-request data leaks.\r\n\r\n**In static helpers or libraries with no DI** — this requires an architectural change. Pass `HttpContext` (or the specific value needed) as a method parameter from the call site. Avoid wrapping `IHttpContextAccessor` in a static accessor because it reintroduces the same coupling.\r\n\r\n### Step 3: Migrate Request Access Patterns\r\n\r\nRequest APIs changed types and behavior between Framework and Core:\r\n\r\n**QueryString** — `NameValueCollection` → `IQueryCollection`:\r\n\r\nBefore:\r\n```csharp\r\nstring page = Request.QueryString[\"page\"];\r\n```\r\n\r\nAfter:\r\n```csharp\r\nstring page = Request.Query[\"page\"].ToString();\r\n```\r\n\r\n`IQueryCollection` indexer returns `StringValues`; call `.ToString()` or use `.FirstOrDefault()` for a single value.\r\n\r\n**Form data** — async reading required:\r\n\r\nBefore:\r\n```csharp\r\nstring name = Request.Form[\"name\"];\r\n```\r\n\r\nAfter:\r\n```csharp\r\nvar form = await Request.ReadFormAsync();\r\nstring name = form[\"name\"].ToString();\r\n```\r\n\r\nIn controller actions, prefer model binding (`[FromForm]` attribute) over manual form reading.\r\n\r\n**Request body (InputStream)** — `Stream` → `HttpRequest.Body`:\r\n\r\nBefore:\r\n```csharp\r\nusing (var reader = new StreamReader(Request.InputStream))\r\n{\r\n    string body = reader.ReadToEnd();\r\n}\r\n```\r\n\r\nAfter:\r\n```csharp\r\nusing var reader = new StreamReader(Request.Body);\r\nstring body = await reader.ReadToEndAsync();\r\n```\r\n\r\nEnable request buffering if the body must be read multiple times:\r\n```csharp\r\nRequest.EnableBuffering();\r\n```\r\n\r\n**File uploads** — `HttpFileCollection` → `IFormFileCollection`:\r\n\r\nBefore:\r\n```csharp\r\nHttpPostedFileBase file = Request.Files[\"upload\"];\r\nfile.SaveAs(Server.MapPath(\"~\u002Fuploads\u002F\" + file.FileName));\r\n```\r\n\r\nAfter:\r\n```csharp\r\nIFormFile file = Request.Form.Files[\"upload\"];\r\nusing var stream = new FileStream(Path.Combine(uploadPath, file.FileName), FileMode.Create);\r\nawait file.CopyToAsync(stream);\r\n```\r\n\r\n**ServerVariables** — no direct equivalent. Map to specific properties:\r\n\r\n| `Request.ServerVariables[key]` | ASP.NET Core Equivalent |\r\n|---|---|\r\n| `REMOTE_ADDR` | `HttpContext.Connection.RemoteIpAddress` |\r\n| `SERVER_NAME` | `Request.Host.Host` |\r\n| `SERVER_PORT` | `Request.Host.Port` |\r\n| `HTTP_HOST` | `Request.Headers[\"Host\"]` |\r\n| `PATH_INFO` | `Request.Path` |\r\n| `QUERY_STRING` | `Request.QueryString.Value` |\r\n| `CONTENT_TYPE` | `Request.ContentType` |\r\n| `CONTENT_LENGTH` | `Request.ContentLength` |\r\n\r\n### Step 4: Migrate Response Access Patterns\r\n\r\n**Response.Write()** — sync writing is not supported by Kestrel:\r\n\r\nBefore:\r\n```csharp\r\nResponse.Write(\"\u003Chtml>\u003Cbody>Hello\u003C\u002Fbody>\u003C\u002Fhtml>\");\r\nResponse.Write(jsonString);\r\n```\r\n\r\nAfter:\r\n```csharp\r\nawait Response.WriteAsync(\"\u003Chtml>\u003Cbody>Hello\u003C\u002Fbody>\u003C\u002Fhtml>\");\r\nawait Response.WriteAsync(jsonString);\r\n```\r\n\r\nIn controller actions, prefer returning `IActionResult` (e.g., `Content()`, `Json()`, `View()`) instead of writing directly to the response stream.\r\n\r\n**Response.End()** — removed, no direct equivalent:\r\n\r\nBefore:\r\n```csharp\r\nResponse.Write(data);\r\nResponse.End();\r\n```\r\n\r\nAfter — in middleware, return without calling `next()`. In controllers, return an `IActionResult`:\r\n```csharp\r\nawait Response.WriteAsync(data);\r\nreturn; \u002F\u002F In middleware — do not call next()\r\n```\r\n\r\nTo forcefully abort a connection (rare), use `HttpContext.Abort()`.\r\n\r\n**Response.AddHeader() \u002F AppendHeader()** — use `Headers.Append()`:\r\n\r\nBefore:\r\n```csharp\r\nResponse.AddHeader(\"X-Custom-Header\", \"value\");\r\nResponse.AppendHeader(\"Cache-Control\", \"no-cache\");\r\n```\r\n\r\nAfter:\r\n```csharp\r\nResponse.Headers.Append(\"X-Custom-Header\", \"value\");\r\nResponse.Headers.Append(\"Cache-Control\", \"no-cache\");\r\n```\r\n\r\nHeaders must be set before writing to the response body. In Framework this was loosely enforced; in Core, writing headers after the response has started throws an `InvalidOperationException`.\r\n\r\n**Response.Redirect()** — compatible but behavior differs:\r\n\r\nBefore:\r\n```csharp\r\nResponse.Redirect(\"~\u002Fhome\");       \u002F\u002F Redirect + Response.End()\r\nResponse.Redirect(\"~\u002Fhome\", false); \u002F\u002F Redirect without ending\r\n```\r\n\r\nAfter:\r\n```csharp\r\nResponse.Redirect(\"\u002Fhome\");         \u002F\u002F Sets 302, does NOT abort\r\nreturn;                              \u002F\u002F Must explicitly return\r\n```\r\n\r\nCore's `Redirect` does not end the response or call `Response.End()`. Always return from the action or middleware after calling `Redirect()` to prevent further processing.\r\n\r\n**Response buffering** — Core does not buffer responses by default. For scenarios requiring buffering (e.g., setting headers after partial writes), use `Response.StartAsync()` awareness or enable response buffering middleware.\r\n\r\n### Step 5: Replace HttpServerUtility Calls\r\n\r\n`HttpContext.Current.Server` (`HttpServerUtility`) has no single replacement in Core. Replace method by method:\r\n\r\n| `Server.` Method | ASP.NET Core Replacement |\r\n|---|---|\r\n| `Server.MapPath(\"~\u002Fpath\")` | `IWebHostEnvironment.ContentRootPath` or `.WebRootPath` + `Path.Combine()` |\r\n| `Server.HtmlEncode(s)` | `System.Net.WebUtility.HtmlEncode(s)` or `HtmlEncoder.Default.Encode(s)` |\r\n| `Server.HtmlDecode(s)` | `System.Net.WebUtility.HtmlDecode(s)` |\r\n| `Server.UrlEncode(s)` | `System.Net.WebUtility.UrlEncode(s)` or `Uri.EscapeDataString(s)` |\r\n| `Server.UrlDecode(s)` | `System.Net.WebUtility.UrlDecode(s)` or `Uri.UnescapeDataString(s)` |\r\n| `Server.Transfer(url)` | No equivalent — rewrite as redirect or internal rewrite middleware |\r\n| `Server.Execute(url)` | No equivalent — refactor to call the target logic directly |\r\n| `Server.GetLastError()` | `IExceptionHandlerFeature` in exception handler middleware |\r\n| `Server.ScriptTimeout` | `RequestTimeoutOptions` or `CancellationToken` with timeout |\r\n\r\nFor `MapPath`, inject `IWebHostEnvironment`:\r\n\r\nBefore:\r\n```csharp\r\nstring path = HttpContext.Current.Server.MapPath(\"~\u002FContent\u002Fdata.json\");\r\n```\r\n\r\nAfter:\r\n```csharp\r\npublic class DataService\r\n{\r\n    private readonly IWebHostEnvironment _env;\r\n\r\n    public DataService(IWebHostEnvironment env)\r\n    {\r\n        _env = env;\r\n    }\r\n\r\n    public string GetDataPath()\r\n    {\r\n        return Path.Combine(_env.WebRootPath, \"Content\", \"data.json\");\r\n    }\r\n}\r\n```\r\n\r\n### Step 6: Migrate ClaimsPrincipal.Current\r\n\r\n`ClaimsPrincipal.Current` is a static thread-based accessor that does not work reliably in ASP.NET Core's async pipeline.\r\n\r\n**In controllers** — use the `User` property:\r\n\r\nBefore:\r\n```csharp\r\nvar claims = ClaimsPrincipal.Current.Claims;\r\n```\r\n\r\nAfter:\r\n```csharp\r\nvar claims = User.Claims;\r\n```\r\n\r\n**In services** — inject `IHttpContextAccessor`:\r\n\r\nBefore:\r\n```csharp\r\npublic class PermissionService\r\n{\r\n    public bool HasRole(string role)\r\n    {\r\n        return ClaimsPrincipal.Current.IsInRole(role);\r\n    }\r\n}\r\n```\r\n\r\nAfter:\r\n```csharp\r\npublic class PermissionService\r\n{\r\n    private readonly IHttpContextAccessor _accessor;\r\n\r\n    public PermissionService(IHttpContextAccessor accessor)\r\n    {\r\n        _accessor = accessor;\r\n    }\r\n\r\n    public bool HasRole(string role)\r\n    {\r\n        return _accessor.HttpContext?.User.IsInRole(role) ?? false;\r\n    }\r\n}\r\n```\r\n\r\nCustom `ClaimsPrincipal` factories that set `ClaimsPrincipal.Current` should be replaced with claims transformation. Register an `IClaimsTransformation` implementation:\r\n\r\n```csharp\r\nbuilder.Services.AddTransient\u003CIClaimsTransformation, CustomClaimsTransformation>();\r\n```\r\n\r\n### Step 7: Remove Legacy References\r\n\r\nRemove all legacy HttpContext artifacts:\r\n\r\n- Remove `using System.Web` statements that are no longer needed\r\n- Remove any custom `HttpContextBase` \u002F `HttpContextWrapper` abstractions\r\n- Remove `HttpContext.Current` shim or facade classes\r\n- Search for remaining references to `HttpContext.Current`, `ClaimsPrincipal.Current`, `HttpServerUtility`, `Request.ServerVariables`, `Response.Write(` (sync overload), and `Response.End()`\r\n\r\n## Success Criteria\r\n\r\n- No references to `HttpContext.Current` remain in the project\r\n- `IHttpContextAccessor` registered and injected where services need `HttpContext`\r\n- No singleton services cache `HttpContext` references in fields\r\n- All `Request.InputStream` reads converted to async `Request.Body` reads\r\n- All `Response.Write()` calls converted to `await Response.WriteAsync()` or `IActionResult`\r\n- `Response.End()` calls removed and replaced with return statements or `HttpContext.Abort()`\r\n- `HttpServerUtility` calls replaced with Core equivalents\r\n- `ClaimsPrincipal.Current` replaced with `User` property or `IHttpContextAccessor`\r\n- No `Request.ServerVariables` access remains\r\n- Headers set before writing to response body\r\n- Project builds without errors\r\n",{"data":36,"body":40},{"name":4,"description":6,"metadata":37},{"traits":38,"discovery":39},".NET|CSharp|VisualBasic|DotNetCore","lazy",{"type":41,"children":42},"root",[43,52,59,104,127,133,138,150,157,162,315,320,326,336,354,359,449,454,527,545,549,608,612,728,740,754,797,821,827,832,856,860,874,878,892,926,936,940,954,958,981,994,1017,1021,1058,1062,1085,1090,1104,1127,1131,1154,1158,1189,1199,1399,1405,1414,1418,1441,1445,1468,1503,1512,1516,1539,1558,1581,1594,1611,1615,1638,1642,1665,1677,1687,1691,1714,1718,1741,1769,1787,1793,1810,2067,2086,2090,2104,2108,2219,2225,2235,2251,2255,2269,2273,2287,2302,2306,2365,2369,2478,2506,2520,2526,2531,2620,2626,2780],{"type":44,"tag":45,"props":46,"children":48},"element","h1",{"id":47},"aspnet-mvc-httpcontext-and-requestresponse-migration",[49],{"type":50,"value":51},"text","ASP.NET MVC HttpContext and Request\u002FResponse Migration",{"type":44,"tag":53,"props":54,"children":56},"h2",{"id":55},"overview",[57],{"type":50,"value":58},"Overview",{"type":44,"tag":60,"props":61,"children":62},"p",{},[63,65,72,74,80,81,87,89,95,97,102],{"type":50,"value":64},"Migrate ",{"type":44,"tag":66,"props":67,"children":69},"code",{"className":68},[],[70],{"type":50,"value":71},"HttpContext.Current",{"type":50,"value":73},", ",{"type":44,"tag":66,"props":75,"children":77},{"className":76},[],[78],{"type":50,"value":79},"HttpRequest",{"type":50,"value":73},{"type":44,"tag":66,"props":82,"children":84},{"className":83},[],[85],{"type":50,"value":86},"HttpResponse",{"type":50,"value":88},", and ",{"type":44,"tag":66,"props":90,"children":92},{"className":91},[],[93],{"type":50,"value":94},"HttpServerUtility",{"type":50,"value":96}," usage from ASP.NET Framework to ASP.NET Core. The static ",{"type":44,"tag":66,"props":98,"children":100},{"className":99},[],[101],{"type":50,"value":71},{"type":50,"value":103}," accessor is removed in Core — all context access flows through dependency injection or controller base class properties. Response writing is async-only in Kestrel, and request reading APIs have changed types and behavior.",{"type":44,"tag":105,"props":106,"children":107},"blockquote",{},[108],{"type":44,"tag":60,"props":109,"children":110},{},[111,117,119,125],{"type":44,"tag":112,"props":113,"children":114},"strong",{},[115],{"type":50,"value":116},"Adapter precedence",{"type":50,"value":118},": If the ",{"type":44,"tag":66,"props":120,"children":122},{"className":121},[],[123],{"type":50,"value":124},"aspnet-system-web-adapters",{"type":50,"value":126}," skill is loaded, its guidance takes precedence over HttpContext.Current, Request Access, Response Access, and ClaimsPrincipal.Current sections during scaffold and migrate task phases.",{"type":44,"tag":53,"props":128,"children":130},{"id":129},"workflow",[131],{"type":50,"value":132},"Workflow",{"type":44,"tag":60,"props":134,"children":135},{},[136],{"type":50,"value":137},"Track progress across these steps:",{"type":44,"tag":139,"props":140,"children":144},"pre",{"className":141,"code":143,"language":50},[142],"language-text","Migration Progress:\n- [ ] Step 1: Inventory HttpContext usage patterns\n- [ ] Step 2: Eliminate HttpContext.Current\n- [ ] Step 3: Migrate request access patterns\n- [ ] Step 4: Migrate response access patterns\n- [ ] Step 5: Replace HttpServerUtility calls\n- [ ] Step 6: Migrate ClaimsPrincipal.Current\n- [ ] Step 7: Remove legacy references\n",[145],{"type":44,"tag":66,"props":146,"children":148},{"__ignoreMap":147},"",[149],{"type":50,"value":143},{"type":44,"tag":151,"props":152,"children":154},"h3",{"id":153},"step-1-inventory-httpcontext-usage-patterns",[155],{"type":50,"value":156},"Step 1: Inventory HttpContext Usage Patterns",{"type":44,"tag":60,"props":158,"children":159},{},[160],{"type":50,"value":161},"Scan the project for all HttpContext-related usage:",{"type":44,"tag":163,"props":164,"children":165},"ul",{},[166,177,196,236,254,265,290],{"type":44,"tag":167,"props":168,"children":169},"li",{},[170,175],{"type":44,"tag":66,"props":171,"children":173},{"className":172},[],[174],{"type":50,"value":71},{"type":50,"value":176}," — static access in controllers, services, libraries, and helpers",{"type":44,"tag":167,"props":178,"children":179},{},[180,186,188,194],{"type":44,"tag":66,"props":181,"children":183},{"className":182},[],[184],{"type":50,"value":185},"HttpContext.Current.Request",{"type":50,"value":187}," \u002F ",{"type":44,"tag":66,"props":189,"children":191},{"className":190},[],[192],{"type":50,"value":193},".Response",{"type":50,"value":195}," — direct request\u002Fresponse property access",{"type":44,"tag":167,"props":197,"children":198},{},[199,205,207,212,214,220,221,227,228,234],{"type":44,"tag":66,"props":200,"children":202},{"className":201},[],[203],{"type":50,"value":204},"HttpContext.Current.Server",{"type":50,"value":206}," — ",{"type":44,"tag":66,"props":208,"children":210},{"className":209},[],[211],{"type":50,"value":94},{"type":50,"value":213}," calls (",{"type":44,"tag":66,"props":215,"children":217},{"className":216},[],[218],{"type":50,"value":219},"MapPath",{"type":50,"value":73},{"type":44,"tag":66,"props":222,"children":224},{"className":223},[],[225],{"type":50,"value":226},"HtmlEncode",{"type":50,"value":73},{"type":44,"tag":66,"props":229,"children":231},{"className":230},[],[232],{"type":50,"value":233},"UrlEncode",{"type":50,"value":235},")",{"type":44,"tag":167,"props":237,"children":238},{},[239,245,246,252],{"type":44,"tag":66,"props":240,"children":242},{"className":241},[],[243],{"type":50,"value":244},"HttpContext.Current.User",{"type":50,"value":187},{"type":44,"tag":66,"props":247,"children":249},{"className":248},[],[250],{"type":50,"value":251},"ClaimsPrincipal.Current",{"type":50,"value":253}," — identity access",{"type":44,"tag":167,"props":255,"children":256},{},[257,263],{"type":44,"tag":66,"props":258,"children":260},{"className":259},[],[261],{"type":50,"value":262},"HttpContext.Current.Items",{"type":50,"value":264}," — per-request storage",{"type":44,"tag":167,"props":266,"children":267},{},[268,274,275,281,282,288],{"type":44,"tag":66,"props":269,"children":271},{"className":270},[],[272],{"type":50,"value":273},"Request.InputStream",{"type":50,"value":73},{"type":44,"tag":66,"props":276,"children":278},{"className":277},[],[279],{"type":50,"value":280},"Request.Files",{"type":50,"value":73},{"type":44,"tag":66,"props":283,"children":285},{"className":284},[],[286],{"type":50,"value":287},"Request.ServerVariables",{"type":50,"value":289}," — changed APIs",{"type":44,"tag":167,"props":291,"children":292},{},[293,299,300,306,307,313],{"type":44,"tag":66,"props":294,"children":296},{"className":295},[],[297],{"type":50,"value":298},"Response.Write()",{"type":50,"value":73},{"type":44,"tag":66,"props":301,"children":303},{"className":302},[],[304],{"type":50,"value":305},"Response.End()",{"type":50,"value":73},{"type":44,"tag":66,"props":308,"children":310},{"className":309},[],[311],{"type":50,"value":312},"Response.AddHeader()",{"type":50,"value":314}," — removed or changed methods",{"type":44,"tag":60,"props":316,"children":317},{},[318],{"type":50,"value":319},"Categorize each usage site by location: controller, service\u002Flibrary, middleware, or static helper. Location determines the migration strategy.",{"type":44,"tag":151,"props":321,"children":323},{"id":322},"step-2-eliminate-httpcontextcurrent",[324],{"type":50,"value":325},"Step 2: Eliminate HttpContext.Current",{"type":44,"tag":60,"props":327,"children":328},{},[329,334],{"type":44,"tag":66,"props":330,"children":332},{"className":331},[],[333],{"type":50,"value":71},{"type":50,"value":335}," does not exist in ASP.NET Core. The replacement depends on where the access occurs.",{"type":44,"tag":60,"props":337,"children":338},{},[339,344,346,352],{"type":44,"tag":112,"props":340,"children":341},{},[342],{"type":50,"value":343},"In controllers",{"type":50,"value":345}," — use the ",{"type":44,"tag":66,"props":347,"children":349},{"className":348},[],[350],{"type":50,"value":351},"HttpContext",{"type":50,"value":353}," property directly:",{"type":44,"tag":60,"props":355,"children":356},{},[357],{"type":50,"value":358},"Before:",{"type":44,"tag":139,"props":360,"children":364},{"className":361,"code":362,"language":363,"meta":147,"style":147},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","public class ProductController : Controller\n{\n    public ActionResult Index()\n    {\n        var userId = HttpContext.Current.User.Identity.Name;\n        HttpContext.Current.Items[\"LastAccess\"] = DateTime.UtcNow;\n        return View();\n    }\n}\n","csharp",[365],{"type":44,"tag":66,"props":366,"children":367},{"__ignoreMap":147},[368,378,387,396,405,414,423,431,440],{"type":44,"tag":369,"props":370,"children":372},"span",{"class":371,"line":29},"line",[373],{"type":44,"tag":369,"props":374,"children":375},{},[376],{"type":50,"value":377},"public class ProductController : Controller\n",{"type":44,"tag":369,"props":379,"children":381},{"class":371,"line":380},2,[382],{"type":44,"tag":369,"props":383,"children":384},{},[385],{"type":50,"value":386},"{\n",{"type":44,"tag":369,"props":388,"children":390},{"class":371,"line":389},3,[391],{"type":44,"tag":369,"props":392,"children":393},{},[394],{"type":50,"value":395},"    public ActionResult Index()\n",{"type":44,"tag":369,"props":397,"children":399},{"class":371,"line":398},4,[400],{"type":44,"tag":369,"props":401,"children":402},{},[403],{"type":50,"value":404},"    {\n",{"type":44,"tag":369,"props":406,"children":408},{"class":371,"line":407},5,[409],{"type":44,"tag":369,"props":410,"children":411},{},[412],{"type":50,"value":413},"        var userId = HttpContext.Current.User.Identity.Name;\n",{"type":44,"tag":369,"props":415,"children":417},{"class":371,"line":416},6,[418],{"type":44,"tag":369,"props":419,"children":420},{},[421],{"type":50,"value":422},"        HttpContext.Current.Items[\"LastAccess\"] = DateTime.UtcNow;\n",{"type":44,"tag":369,"props":424,"children":425},{"class":371,"line":25},[426],{"type":44,"tag":369,"props":427,"children":428},{},[429],{"type":50,"value":430},"        return View();\n",{"type":44,"tag":369,"props":432,"children":434},{"class":371,"line":433},8,[435],{"type":44,"tag":369,"props":436,"children":437},{},[438],{"type":50,"value":439},"    }\n",{"type":44,"tag":369,"props":441,"children":443},{"class":371,"line":442},9,[444],{"type":44,"tag":369,"props":445,"children":446},{},[447],{"type":50,"value":448},"}\n",{"type":44,"tag":60,"props":450,"children":451},{},[452],{"type":50,"value":453},"After:",{"type":44,"tag":139,"props":455,"children":457},{"className":361,"code":456,"language":363,"meta":147,"style":147},"public class ProductController : Controller\n{\n    public IActionResult Index()\n    {\n        var userId = HttpContext.User.Identity?.Name;\n        HttpContext.Items[\"LastAccess\"] = DateTime.UtcNow;\n        return View();\n    }\n}\n",[458],{"type":44,"tag":66,"props":459,"children":460},{"__ignoreMap":147},[461,468,475,483,490,498,506,513,520],{"type":44,"tag":369,"props":462,"children":463},{"class":371,"line":29},[464],{"type":44,"tag":369,"props":465,"children":466},{},[467],{"type":50,"value":377},{"type":44,"tag":369,"props":469,"children":470},{"class":371,"line":380},[471],{"type":44,"tag":369,"props":472,"children":473},{},[474],{"type":50,"value":386},{"type":44,"tag":369,"props":476,"children":477},{"class":371,"line":389},[478],{"type":44,"tag":369,"props":479,"children":480},{},[481],{"type":50,"value":482},"    public IActionResult Index()\n",{"type":44,"tag":369,"props":484,"children":485},{"class":371,"line":398},[486],{"type":44,"tag":369,"props":487,"children":488},{},[489],{"type":50,"value":404},{"type":44,"tag":369,"props":491,"children":492},{"class":371,"line":407},[493],{"type":44,"tag":369,"props":494,"children":495},{},[496],{"type":50,"value":497},"        var userId = HttpContext.User.Identity?.Name;\n",{"type":44,"tag":369,"props":499,"children":500},{"class":371,"line":416},[501],{"type":44,"tag":369,"props":502,"children":503},{},[504],{"type":50,"value":505},"        HttpContext.Items[\"LastAccess\"] = DateTime.UtcNow;\n",{"type":44,"tag":369,"props":507,"children":508},{"class":371,"line":25},[509],{"type":44,"tag":369,"props":510,"children":511},{},[512],{"type":50,"value":430},{"type":44,"tag":369,"props":514,"children":515},{"class":371,"line":433},[516],{"type":44,"tag":369,"props":517,"children":518},{},[519],{"type":50,"value":439},{"type":44,"tag":369,"props":521,"children":522},{"class":371,"line":442},[523],{"type":44,"tag":369,"props":524,"children":525},{},[526],{"type":50,"value":448},{"type":44,"tag":60,"props":528,"children":529},{},[530,535,537,543],{"type":44,"tag":112,"props":531,"children":532},{},[533],{"type":50,"value":534},"In services and libraries",{"type":50,"value":536}," — inject ",{"type":44,"tag":66,"props":538,"children":540},{"className":539},[],[541],{"type":50,"value":542},"IHttpContextAccessor",{"type":50,"value":544},":",{"type":44,"tag":60,"props":546,"children":547},{},[548],{"type":50,"value":358},{"type":44,"tag":139,"props":550,"children":552},{"className":361,"code":551,"language":363,"meta":147,"style":147},"public class AuditService\n{\n    public string GetCurrentUser()\n    {\n        return HttpContext.Current.User.Identity.Name;\n    }\n}\n",[553],{"type":44,"tag":66,"props":554,"children":555},{"__ignoreMap":147},[556,564,571,579,586,594,601],{"type":44,"tag":369,"props":557,"children":558},{"class":371,"line":29},[559],{"type":44,"tag":369,"props":560,"children":561},{},[562],{"type":50,"value":563},"public class AuditService\n",{"type":44,"tag":369,"props":565,"children":566},{"class":371,"line":380},[567],{"type":44,"tag":369,"props":568,"children":569},{},[570],{"type":50,"value":386},{"type":44,"tag":369,"props":572,"children":573},{"class":371,"line":389},[574],{"type":44,"tag":369,"props":575,"children":576},{},[577],{"type":50,"value":578},"    public string GetCurrentUser()\n",{"type":44,"tag":369,"props":580,"children":581},{"class":371,"line":398},[582],{"type":44,"tag":369,"props":583,"children":584},{},[585],{"type":50,"value":404},{"type":44,"tag":369,"props":587,"children":588},{"class":371,"line":407},[589],{"type":44,"tag":369,"props":590,"children":591},{},[592],{"type":50,"value":593},"        return HttpContext.Current.User.Identity.Name;\n",{"type":44,"tag":369,"props":595,"children":596},{"class":371,"line":416},[597],{"type":44,"tag":369,"props":598,"children":599},{},[600],{"type":50,"value":439},{"type":44,"tag":369,"props":602,"children":603},{"class":371,"line":25},[604],{"type":44,"tag":369,"props":605,"children":606},{},[607],{"type":50,"value":448},{"type":44,"tag":60,"props":609,"children":610},{},[611],{"type":50,"value":453},{"type":44,"tag":139,"props":613,"children":615},{"className":361,"code":614,"language":363,"meta":147,"style":147},"public class AuditService\n{\n    private readonly IHttpContextAccessor _httpContextAccessor;\n\n    public AuditService(IHttpContextAccessor httpContextAccessor)\n    {\n        _httpContextAccessor = httpContextAccessor;\n    }\n\n    public string GetCurrentUser()\n    {\n        return _httpContextAccessor.HttpContext?.User.Identity?.Name ?? string.Empty;\n    }\n}\n",[616],{"type":44,"tag":66,"props":617,"children":618},{"__ignoreMap":147},[619,626,633,641,650,658,665,673,680,687,695,703,712,720],{"type":44,"tag":369,"props":620,"children":621},{"class":371,"line":29},[622],{"type":44,"tag":369,"props":623,"children":624},{},[625],{"type":50,"value":563},{"type":44,"tag":369,"props":627,"children":628},{"class":371,"line":380},[629],{"type":44,"tag":369,"props":630,"children":631},{},[632],{"type":50,"value":386},{"type":44,"tag":369,"props":634,"children":635},{"class":371,"line":389},[636],{"type":44,"tag":369,"props":637,"children":638},{},[639],{"type":50,"value":640},"    private readonly IHttpContextAccessor _httpContextAccessor;\n",{"type":44,"tag":369,"props":642,"children":643},{"class":371,"line":398},[644],{"type":44,"tag":369,"props":645,"children":647},{"emptyLinePlaceholder":646},true,[648],{"type":50,"value":649},"\n",{"type":44,"tag":369,"props":651,"children":652},{"class":371,"line":407},[653],{"type":44,"tag":369,"props":654,"children":655},{},[656],{"type":50,"value":657},"    public AuditService(IHttpContextAccessor httpContextAccessor)\n",{"type":44,"tag":369,"props":659,"children":660},{"class":371,"line":416},[661],{"type":44,"tag":369,"props":662,"children":663},{},[664],{"type":50,"value":404},{"type":44,"tag":369,"props":666,"children":667},{"class":371,"line":25},[668],{"type":44,"tag":369,"props":669,"children":670},{},[671],{"type":50,"value":672},"        _httpContextAccessor = httpContextAccessor;\n",{"type":44,"tag":369,"props":674,"children":675},{"class":371,"line":433},[676],{"type":44,"tag":369,"props":677,"children":678},{},[679],{"type":50,"value":439},{"type":44,"tag":369,"props":681,"children":682},{"class":371,"line":442},[683],{"type":44,"tag":369,"props":684,"children":685},{"emptyLinePlaceholder":646},[686],{"type":50,"value":649},{"type":44,"tag":369,"props":688,"children":690},{"class":371,"line":689},10,[691],{"type":44,"tag":369,"props":692,"children":693},{},[694],{"type":50,"value":578},{"type":44,"tag":369,"props":696,"children":698},{"class":371,"line":697},11,[699],{"type":44,"tag":369,"props":700,"children":701},{},[702],{"type":50,"value":404},{"type":44,"tag":369,"props":704,"children":706},{"class":371,"line":705},12,[707],{"type":44,"tag":369,"props":708,"children":709},{},[710],{"type":50,"value":711},"        return _httpContextAccessor.HttpContext?.User.Identity?.Name ?? string.Empty;\n",{"type":44,"tag":369,"props":713,"children":715},{"class":371,"line":714},13,[716],{"type":44,"tag":369,"props":717,"children":718},{},[719],{"type":50,"value":439},{"type":44,"tag":369,"props":721,"children":723},{"class":371,"line":722},14,[724],{"type":44,"tag":369,"props":725,"children":726},{},[727],{"type":50,"value":448},{"type":44,"tag":60,"props":729,"children":730},{},[731,733,739],{"type":50,"value":732},"Register the accessor in ",{"type":44,"tag":66,"props":734,"children":736},{"className":735},[],[737],{"type":50,"value":738},"Program.cs",{"type":50,"value":544},{"type":44,"tag":139,"props":741,"children":743},{"className":361,"code":742,"language":363,"meta":147,"style":147},"builder.Services.AddHttpContextAccessor();\n",[744],{"type":44,"tag":66,"props":745,"children":746},{"__ignoreMap":147},[747],{"type":44,"tag":369,"props":748,"children":749},{"class":371,"line":29},[750],{"type":44,"tag":369,"props":751,"children":752},{},[753],{"type":50,"value":742},{"type":44,"tag":105,"props":755,"children":756},{},[757],{"type":44,"tag":60,"props":758,"children":759},{},[760,765,767,772,774,780,782,788,790,795],{"type":44,"tag":112,"props":761,"children":762},{},[763],{"type":50,"value":764},"Threading concern",{"type":50,"value":766},": ",{"type":44,"tag":66,"props":768,"children":770},{"className":769},[],[771],{"type":50,"value":542},{"type":50,"value":773}," uses ",{"type":44,"tag":66,"props":775,"children":777},{"className":776},[],[778],{"type":50,"value":779},"AsyncLocal\u003CT>",{"type":50,"value":781},". In singleton services, always access ",{"type":44,"tag":66,"props":783,"children":785},{"className":784},[],[786],{"type":50,"value":787},".HttpContext",{"type":50,"value":789}," at call time — never cache the ",{"type":44,"tag":66,"props":791,"children":793},{"className":792},[],[794],{"type":50,"value":351},{"type":50,"value":796}," reference in a field. A cached reference may belong to a completed request and produce null-reference or cross-request data leaks.",{"type":44,"tag":60,"props":798,"children":799},{},[800,805,807,812,814,819],{"type":44,"tag":112,"props":801,"children":802},{},[803],{"type":50,"value":804},"In static helpers or libraries with no DI",{"type":50,"value":806}," — this requires an architectural change. Pass ",{"type":44,"tag":66,"props":808,"children":810},{"className":809},[],[811],{"type":50,"value":351},{"type":50,"value":813}," (or the specific value needed) as a method parameter from the call site. Avoid wrapping ",{"type":44,"tag":66,"props":815,"children":817},{"className":816},[],[818],{"type":50,"value":542},{"type":50,"value":820}," in a static accessor because it reintroduces the same coupling.",{"type":44,"tag":151,"props":822,"children":824},{"id":823},"step-3-migrate-request-access-patterns",[825],{"type":50,"value":826},"Step 3: Migrate Request Access Patterns",{"type":44,"tag":60,"props":828,"children":829},{},[830],{"type":50,"value":831},"Request APIs changed types and behavior between Framework and Core:",{"type":44,"tag":60,"props":833,"children":834},{},[835,840,841,847,849,855],{"type":44,"tag":112,"props":836,"children":837},{},[838],{"type":50,"value":839},"QueryString",{"type":50,"value":206},{"type":44,"tag":66,"props":842,"children":844},{"className":843},[],[845],{"type":50,"value":846},"NameValueCollection",{"type":50,"value":848}," → ",{"type":44,"tag":66,"props":850,"children":852},{"className":851},[],[853],{"type":50,"value":854},"IQueryCollection",{"type":50,"value":544},{"type":44,"tag":60,"props":857,"children":858},{},[859],{"type":50,"value":358},{"type":44,"tag":139,"props":861,"children":863},{"className":361,"code":862,"language":363,"meta":147,"style":147},"string page = Request.QueryString[\"page\"];\n",[864],{"type":44,"tag":66,"props":865,"children":866},{"__ignoreMap":147},[867],{"type":44,"tag":369,"props":868,"children":869},{"class":371,"line":29},[870],{"type":44,"tag":369,"props":871,"children":872},{},[873],{"type":50,"value":862},{"type":44,"tag":60,"props":875,"children":876},{},[877],{"type":50,"value":453},{"type":44,"tag":139,"props":879,"children":881},{"className":361,"code":880,"language":363,"meta":147,"style":147},"string page = Request.Query[\"page\"].ToString();\n",[882],{"type":44,"tag":66,"props":883,"children":884},{"__ignoreMap":147},[885],{"type":44,"tag":369,"props":886,"children":887},{"class":371,"line":29},[888],{"type":44,"tag":369,"props":889,"children":890},{},[891],{"type":50,"value":880},{"type":44,"tag":60,"props":893,"children":894},{},[895,900,902,908,910,916,918,924],{"type":44,"tag":66,"props":896,"children":898},{"className":897},[],[899],{"type":50,"value":854},{"type":50,"value":901}," indexer returns ",{"type":44,"tag":66,"props":903,"children":905},{"className":904},[],[906],{"type":50,"value":907},"StringValues",{"type":50,"value":909},"; call ",{"type":44,"tag":66,"props":911,"children":913},{"className":912},[],[914],{"type":50,"value":915},".ToString()",{"type":50,"value":917}," or use ",{"type":44,"tag":66,"props":919,"children":921},{"className":920},[],[922],{"type":50,"value":923},".FirstOrDefault()",{"type":50,"value":925}," for a single value.",{"type":44,"tag":60,"props":927,"children":928},{},[929,934],{"type":44,"tag":112,"props":930,"children":931},{},[932],{"type":50,"value":933},"Form data",{"type":50,"value":935}," — async reading required:",{"type":44,"tag":60,"props":937,"children":938},{},[939],{"type":50,"value":358},{"type":44,"tag":139,"props":941,"children":943},{"className":361,"code":942,"language":363,"meta":147,"style":147},"string name = Request.Form[\"name\"];\n",[944],{"type":44,"tag":66,"props":945,"children":946},{"__ignoreMap":147},[947],{"type":44,"tag":369,"props":948,"children":949},{"class":371,"line":29},[950],{"type":44,"tag":369,"props":951,"children":952},{},[953],{"type":50,"value":942},{"type":44,"tag":60,"props":955,"children":956},{},[957],{"type":50,"value":453},{"type":44,"tag":139,"props":959,"children":961},{"className":361,"code":960,"language":363,"meta":147,"style":147},"var form = await Request.ReadFormAsync();\nstring name = form[\"name\"].ToString();\n",[962],{"type":44,"tag":66,"props":963,"children":964},{"__ignoreMap":147},[965,973],{"type":44,"tag":369,"props":966,"children":967},{"class":371,"line":29},[968],{"type":44,"tag":369,"props":969,"children":970},{},[971],{"type":50,"value":972},"var form = await Request.ReadFormAsync();\n",{"type":44,"tag":369,"props":974,"children":975},{"class":371,"line":380},[976],{"type":44,"tag":369,"props":977,"children":978},{},[979],{"type":50,"value":980},"string name = form[\"name\"].ToString();\n",{"type":44,"tag":60,"props":982,"children":983},{},[984,986,992],{"type":50,"value":985},"In controller actions, prefer model binding (",{"type":44,"tag":66,"props":987,"children":989},{"className":988},[],[990],{"type":50,"value":991},"[FromForm]",{"type":50,"value":993}," attribute) over manual form reading.",{"type":44,"tag":60,"props":995,"children":996},{},[997,1002,1003,1009,1010,1016],{"type":44,"tag":112,"props":998,"children":999},{},[1000],{"type":50,"value":1001},"Request body (InputStream)",{"type":50,"value":206},{"type":44,"tag":66,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":50,"value":1008},"Stream",{"type":50,"value":848},{"type":44,"tag":66,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":50,"value":1015},"HttpRequest.Body",{"type":50,"value":544},{"type":44,"tag":60,"props":1018,"children":1019},{},[1020],{"type":50,"value":358},{"type":44,"tag":139,"props":1022,"children":1024},{"className":361,"code":1023,"language":363,"meta":147,"style":147},"using (var reader = new StreamReader(Request.InputStream))\n{\n    string body = reader.ReadToEnd();\n}\n",[1025],{"type":44,"tag":66,"props":1026,"children":1027},{"__ignoreMap":147},[1028,1036,1043,1051],{"type":44,"tag":369,"props":1029,"children":1030},{"class":371,"line":29},[1031],{"type":44,"tag":369,"props":1032,"children":1033},{},[1034],{"type":50,"value":1035},"using (var reader = new StreamReader(Request.InputStream))\n",{"type":44,"tag":369,"props":1037,"children":1038},{"class":371,"line":380},[1039],{"type":44,"tag":369,"props":1040,"children":1041},{},[1042],{"type":50,"value":386},{"type":44,"tag":369,"props":1044,"children":1045},{"class":371,"line":389},[1046],{"type":44,"tag":369,"props":1047,"children":1048},{},[1049],{"type":50,"value":1050},"    string body = reader.ReadToEnd();\n",{"type":44,"tag":369,"props":1052,"children":1053},{"class":371,"line":398},[1054],{"type":44,"tag":369,"props":1055,"children":1056},{},[1057],{"type":50,"value":448},{"type":44,"tag":60,"props":1059,"children":1060},{},[1061],{"type":50,"value":453},{"type":44,"tag":139,"props":1063,"children":1065},{"className":361,"code":1064,"language":363,"meta":147,"style":147},"using var reader = new StreamReader(Request.Body);\nstring body = await reader.ReadToEndAsync();\n",[1066],{"type":44,"tag":66,"props":1067,"children":1068},{"__ignoreMap":147},[1069,1077],{"type":44,"tag":369,"props":1070,"children":1071},{"class":371,"line":29},[1072],{"type":44,"tag":369,"props":1073,"children":1074},{},[1075],{"type":50,"value":1076},"using var reader = new StreamReader(Request.Body);\n",{"type":44,"tag":369,"props":1078,"children":1079},{"class":371,"line":380},[1080],{"type":44,"tag":369,"props":1081,"children":1082},{},[1083],{"type":50,"value":1084},"string body = await reader.ReadToEndAsync();\n",{"type":44,"tag":60,"props":1086,"children":1087},{},[1088],{"type":50,"value":1089},"Enable request buffering if the body must be read multiple times:",{"type":44,"tag":139,"props":1091,"children":1093},{"className":361,"code":1092,"language":363,"meta":147,"style":147},"Request.EnableBuffering();\n",[1094],{"type":44,"tag":66,"props":1095,"children":1096},{"__ignoreMap":147},[1097],{"type":44,"tag":369,"props":1098,"children":1099},{"class":371,"line":29},[1100],{"type":44,"tag":369,"props":1101,"children":1102},{},[1103],{"type":50,"value":1092},{"type":44,"tag":60,"props":1105,"children":1106},{},[1107,1112,1113,1119,1120,1126],{"type":44,"tag":112,"props":1108,"children":1109},{},[1110],{"type":50,"value":1111},"File uploads",{"type":50,"value":206},{"type":44,"tag":66,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":50,"value":1118},"HttpFileCollection",{"type":50,"value":848},{"type":44,"tag":66,"props":1121,"children":1123},{"className":1122},[],[1124],{"type":50,"value":1125},"IFormFileCollection",{"type":50,"value":544},{"type":44,"tag":60,"props":1128,"children":1129},{},[1130],{"type":50,"value":358},{"type":44,"tag":139,"props":1132,"children":1134},{"className":361,"code":1133,"language":363,"meta":147,"style":147},"HttpPostedFileBase file = Request.Files[\"upload\"];\nfile.SaveAs(Server.MapPath(\"~\u002Fuploads\u002F\" + file.FileName));\n",[1135],{"type":44,"tag":66,"props":1136,"children":1137},{"__ignoreMap":147},[1138,1146],{"type":44,"tag":369,"props":1139,"children":1140},{"class":371,"line":29},[1141],{"type":44,"tag":369,"props":1142,"children":1143},{},[1144],{"type":50,"value":1145},"HttpPostedFileBase file = Request.Files[\"upload\"];\n",{"type":44,"tag":369,"props":1147,"children":1148},{"class":371,"line":380},[1149],{"type":44,"tag":369,"props":1150,"children":1151},{},[1152],{"type":50,"value":1153},"file.SaveAs(Server.MapPath(\"~\u002Fuploads\u002F\" + file.FileName));\n",{"type":44,"tag":60,"props":1155,"children":1156},{},[1157],{"type":50,"value":453},{"type":44,"tag":139,"props":1159,"children":1161},{"className":361,"code":1160,"language":363,"meta":147,"style":147},"IFormFile file = Request.Form.Files[\"upload\"];\nusing var stream = new FileStream(Path.Combine(uploadPath, file.FileName), FileMode.Create);\nawait file.CopyToAsync(stream);\n",[1162],{"type":44,"tag":66,"props":1163,"children":1164},{"__ignoreMap":147},[1165,1173,1181],{"type":44,"tag":369,"props":1166,"children":1167},{"class":371,"line":29},[1168],{"type":44,"tag":369,"props":1169,"children":1170},{},[1171],{"type":50,"value":1172},"IFormFile file = Request.Form.Files[\"upload\"];\n",{"type":44,"tag":369,"props":1174,"children":1175},{"class":371,"line":380},[1176],{"type":44,"tag":369,"props":1177,"children":1178},{},[1179],{"type":50,"value":1180},"using var stream = new FileStream(Path.Combine(uploadPath, file.FileName), FileMode.Create);\n",{"type":44,"tag":369,"props":1182,"children":1183},{"class":371,"line":389},[1184],{"type":44,"tag":369,"props":1185,"children":1186},{},[1187],{"type":50,"value":1188},"await file.CopyToAsync(stream);\n",{"type":44,"tag":60,"props":1190,"children":1191},{},[1192,1197],{"type":44,"tag":112,"props":1193,"children":1194},{},[1195],{"type":50,"value":1196},"ServerVariables",{"type":50,"value":1198}," — no direct equivalent. Map to specific properties:",{"type":44,"tag":1200,"props":1201,"children":1202},"table",{},[1203,1226],{"type":44,"tag":1204,"props":1205,"children":1206},"thead",{},[1207],{"type":44,"tag":1208,"props":1209,"children":1210},"tr",{},[1211,1221],{"type":44,"tag":1212,"props":1213,"children":1214},"th",{},[1215],{"type":44,"tag":66,"props":1216,"children":1218},{"className":1217},[],[1219],{"type":50,"value":1220},"Request.ServerVariables[key]",{"type":44,"tag":1212,"props":1222,"children":1223},{},[1224],{"type":50,"value":1225},"ASP.NET Core Equivalent",{"type":44,"tag":1227,"props":1228,"children":1229},"tbody",{},[1230,1252,1273,1294,1315,1336,1357,1378],{"type":44,"tag":1208,"props":1231,"children":1232},{},[1233,1243],{"type":44,"tag":1234,"props":1235,"children":1236},"td",{},[1237],{"type":44,"tag":66,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":50,"value":1242},"REMOTE_ADDR",{"type":44,"tag":1234,"props":1244,"children":1245},{},[1246],{"type":44,"tag":66,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":50,"value":1251},"HttpContext.Connection.RemoteIpAddress",{"type":44,"tag":1208,"props":1253,"children":1254},{},[1255,1264],{"type":44,"tag":1234,"props":1256,"children":1257},{},[1258],{"type":44,"tag":66,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":50,"value":1263},"SERVER_NAME",{"type":44,"tag":1234,"props":1265,"children":1266},{},[1267],{"type":44,"tag":66,"props":1268,"children":1270},{"className":1269},[],[1271],{"type":50,"value":1272},"Request.Host.Host",{"type":44,"tag":1208,"props":1274,"children":1275},{},[1276,1285],{"type":44,"tag":1234,"props":1277,"children":1278},{},[1279],{"type":44,"tag":66,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":50,"value":1284},"SERVER_PORT",{"type":44,"tag":1234,"props":1286,"children":1287},{},[1288],{"type":44,"tag":66,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":50,"value":1293},"Request.Host.Port",{"type":44,"tag":1208,"props":1295,"children":1296},{},[1297,1306],{"type":44,"tag":1234,"props":1298,"children":1299},{},[1300],{"type":44,"tag":66,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":50,"value":1305},"HTTP_HOST",{"type":44,"tag":1234,"props":1307,"children":1308},{},[1309],{"type":44,"tag":66,"props":1310,"children":1312},{"className":1311},[],[1313],{"type":50,"value":1314},"Request.Headers[\"Host\"]",{"type":44,"tag":1208,"props":1316,"children":1317},{},[1318,1327],{"type":44,"tag":1234,"props":1319,"children":1320},{},[1321],{"type":44,"tag":66,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":50,"value":1326},"PATH_INFO",{"type":44,"tag":1234,"props":1328,"children":1329},{},[1330],{"type":44,"tag":66,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":50,"value":1335},"Request.Path",{"type":44,"tag":1208,"props":1337,"children":1338},{},[1339,1348],{"type":44,"tag":1234,"props":1340,"children":1341},{},[1342],{"type":44,"tag":66,"props":1343,"children":1345},{"className":1344},[],[1346],{"type":50,"value":1347},"QUERY_STRING",{"type":44,"tag":1234,"props":1349,"children":1350},{},[1351],{"type":44,"tag":66,"props":1352,"children":1354},{"className":1353},[],[1355],{"type":50,"value":1356},"Request.QueryString.Value",{"type":44,"tag":1208,"props":1358,"children":1359},{},[1360,1369],{"type":44,"tag":1234,"props":1361,"children":1362},{},[1363],{"type":44,"tag":66,"props":1364,"children":1366},{"className":1365},[],[1367],{"type":50,"value":1368},"CONTENT_TYPE",{"type":44,"tag":1234,"props":1370,"children":1371},{},[1372],{"type":44,"tag":66,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":50,"value":1377},"Request.ContentType",{"type":44,"tag":1208,"props":1379,"children":1380},{},[1381,1390],{"type":44,"tag":1234,"props":1382,"children":1383},{},[1384],{"type":44,"tag":66,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":50,"value":1389},"CONTENT_LENGTH",{"type":44,"tag":1234,"props":1391,"children":1392},{},[1393],{"type":44,"tag":66,"props":1394,"children":1396},{"className":1395},[],[1397],{"type":50,"value":1398},"Request.ContentLength",{"type":44,"tag":151,"props":1400,"children":1402},{"id":1401},"step-4-migrate-response-access-patterns",[1403],{"type":50,"value":1404},"Step 4: Migrate Response Access Patterns",{"type":44,"tag":60,"props":1406,"children":1407},{},[1408,1412],{"type":44,"tag":112,"props":1409,"children":1410},{},[1411],{"type":50,"value":298},{"type":50,"value":1413}," — sync writing is not supported by Kestrel:",{"type":44,"tag":60,"props":1415,"children":1416},{},[1417],{"type":50,"value":358},{"type":44,"tag":139,"props":1419,"children":1421},{"className":361,"code":1420,"language":363,"meta":147,"style":147},"Response.Write(\"\u003Chtml>\u003Cbody>Hello\u003C\u002Fbody>\u003C\u002Fhtml>\");\nResponse.Write(jsonString);\n",[1422],{"type":44,"tag":66,"props":1423,"children":1424},{"__ignoreMap":147},[1425,1433],{"type":44,"tag":369,"props":1426,"children":1427},{"class":371,"line":29},[1428],{"type":44,"tag":369,"props":1429,"children":1430},{},[1431],{"type":50,"value":1432},"Response.Write(\"\u003Chtml>\u003Cbody>Hello\u003C\u002Fbody>\u003C\u002Fhtml>\");\n",{"type":44,"tag":369,"props":1434,"children":1435},{"class":371,"line":380},[1436],{"type":44,"tag":369,"props":1437,"children":1438},{},[1439],{"type":50,"value":1440},"Response.Write(jsonString);\n",{"type":44,"tag":60,"props":1442,"children":1443},{},[1444],{"type":50,"value":453},{"type":44,"tag":139,"props":1446,"children":1448},{"className":361,"code":1447,"language":363,"meta":147,"style":147},"await Response.WriteAsync(\"\u003Chtml>\u003Cbody>Hello\u003C\u002Fbody>\u003C\u002Fhtml>\");\nawait Response.WriteAsync(jsonString);\n",[1449],{"type":44,"tag":66,"props":1450,"children":1451},{"__ignoreMap":147},[1452,1460],{"type":44,"tag":369,"props":1453,"children":1454},{"class":371,"line":29},[1455],{"type":44,"tag":369,"props":1456,"children":1457},{},[1458],{"type":50,"value":1459},"await Response.WriteAsync(\"\u003Chtml>\u003Cbody>Hello\u003C\u002Fbody>\u003C\u002Fhtml>\");\n",{"type":44,"tag":369,"props":1461,"children":1462},{"class":371,"line":380},[1463],{"type":44,"tag":369,"props":1464,"children":1465},{},[1466],{"type":50,"value":1467},"await Response.WriteAsync(jsonString);\n",{"type":44,"tag":60,"props":1469,"children":1470},{},[1471,1473,1479,1481,1487,1488,1494,1495,1501],{"type":50,"value":1472},"In controller actions, prefer returning ",{"type":44,"tag":66,"props":1474,"children":1476},{"className":1475},[],[1477],{"type":50,"value":1478},"IActionResult",{"type":50,"value":1480}," (e.g., ",{"type":44,"tag":66,"props":1482,"children":1484},{"className":1483},[],[1485],{"type":50,"value":1486},"Content()",{"type":50,"value":73},{"type":44,"tag":66,"props":1489,"children":1491},{"className":1490},[],[1492],{"type":50,"value":1493},"Json()",{"type":50,"value":73},{"type":44,"tag":66,"props":1496,"children":1498},{"className":1497},[],[1499],{"type":50,"value":1500},"View()",{"type":50,"value":1502},") instead of writing directly to the response stream.",{"type":44,"tag":60,"props":1504,"children":1505},{},[1506,1510],{"type":44,"tag":112,"props":1507,"children":1508},{},[1509],{"type":50,"value":305},{"type":50,"value":1511}," — removed, no direct equivalent:",{"type":44,"tag":60,"props":1513,"children":1514},{},[1515],{"type":50,"value":358},{"type":44,"tag":139,"props":1517,"children":1519},{"className":361,"code":1518,"language":363,"meta":147,"style":147},"Response.Write(data);\nResponse.End();\n",[1520],{"type":44,"tag":66,"props":1521,"children":1522},{"__ignoreMap":147},[1523,1531],{"type":44,"tag":369,"props":1524,"children":1525},{"class":371,"line":29},[1526],{"type":44,"tag":369,"props":1527,"children":1528},{},[1529],{"type":50,"value":1530},"Response.Write(data);\n",{"type":44,"tag":369,"props":1532,"children":1533},{"class":371,"line":380},[1534],{"type":44,"tag":369,"props":1535,"children":1536},{},[1537],{"type":50,"value":1538},"Response.End();\n",{"type":44,"tag":60,"props":1540,"children":1541},{},[1542,1544,1550,1552,1557],{"type":50,"value":1543},"After — in middleware, return without calling ",{"type":44,"tag":66,"props":1545,"children":1547},{"className":1546},[],[1548],{"type":50,"value":1549},"next()",{"type":50,"value":1551},". In controllers, return an ",{"type":44,"tag":66,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":50,"value":1478},{"type":50,"value":544},{"type":44,"tag":139,"props":1559,"children":1561},{"className":361,"code":1560,"language":363,"meta":147,"style":147},"await Response.WriteAsync(data);\nreturn; \u002F\u002F In middleware — do not call next()\n",[1562],{"type":44,"tag":66,"props":1563,"children":1564},{"__ignoreMap":147},[1565,1573],{"type":44,"tag":369,"props":1566,"children":1567},{"class":371,"line":29},[1568],{"type":44,"tag":369,"props":1569,"children":1570},{},[1571],{"type":50,"value":1572},"await Response.WriteAsync(data);\n",{"type":44,"tag":369,"props":1574,"children":1575},{"class":371,"line":380},[1576],{"type":44,"tag":369,"props":1577,"children":1578},{},[1579],{"type":50,"value":1580},"return; \u002F\u002F In middleware — do not call next()\n",{"type":44,"tag":60,"props":1582,"children":1583},{},[1584,1586,1592],{"type":50,"value":1585},"To forcefully abort a connection (rare), use ",{"type":44,"tag":66,"props":1587,"children":1589},{"className":1588},[],[1590],{"type":50,"value":1591},"HttpContext.Abort()",{"type":50,"value":1593},".",{"type":44,"tag":60,"props":1595,"children":1596},{},[1597,1602,1604,1610],{"type":44,"tag":112,"props":1598,"children":1599},{},[1600],{"type":50,"value":1601},"Response.AddHeader() \u002F AppendHeader()",{"type":50,"value":1603}," — use ",{"type":44,"tag":66,"props":1605,"children":1607},{"className":1606},[],[1608],{"type":50,"value":1609},"Headers.Append()",{"type":50,"value":544},{"type":44,"tag":60,"props":1612,"children":1613},{},[1614],{"type":50,"value":358},{"type":44,"tag":139,"props":1616,"children":1618},{"className":361,"code":1617,"language":363,"meta":147,"style":147},"Response.AddHeader(\"X-Custom-Header\", \"value\");\nResponse.AppendHeader(\"Cache-Control\", \"no-cache\");\n",[1619],{"type":44,"tag":66,"props":1620,"children":1621},{"__ignoreMap":147},[1622,1630],{"type":44,"tag":369,"props":1623,"children":1624},{"class":371,"line":29},[1625],{"type":44,"tag":369,"props":1626,"children":1627},{},[1628],{"type":50,"value":1629},"Response.AddHeader(\"X-Custom-Header\", \"value\");\n",{"type":44,"tag":369,"props":1631,"children":1632},{"class":371,"line":380},[1633],{"type":44,"tag":369,"props":1634,"children":1635},{},[1636],{"type":50,"value":1637},"Response.AppendHeader(\"Cache-Control\", \"no-cache\");\n",{"type":44,"tag":60,"props":1639,"children":1640},{},[1641],{"type":50,"value":453},{"type":44,"tag":139,"props":1643,"children":1645},{"className":361,"code":1644,"language":363,"meta":147,"style":147},"Response.Headers.Append(\"X-Custom-Header\", \"value\");\nResponse.Headers.Append(\"Cache-Control\", \"no-cache\");\n",[1646],{"type":44,"tag":66,"props":1647,"children":1648},{"__ignoreMap":147},[1649,1657],{"type":44,"tag":369,"props":1650,"children":1651},{"class":371,"line":29},[1652],{"type":44,"tag":369,"props":1653,"children":1654},{},[1655],{"type":50,"value":1656},"Response.Headers.Append(\"X-Custom-Header\", \"value\");\n",{"type":44,"tag":369,"props":1658,"children":1659},{"class":371,"line":380},[1660],{"type":44,"tag":369,"props":1661,"children":1662},{},[1663],{"type":50,"value":1664},"Response.Headers.Append(\"Cache-Control\", \"no-cache\");\n",{"type":44,"tag":60,"props":1666,"children":1667},{},[1668,1670,1676],{"type":50,"value":1669},"Headers must be set before writing to the response body. In Framework this was loosely enforced; in Core, writing headers after the response has started throws an ",{"type":44,"tag":66,"props":1671,"children":1673},{"className":1672},[],[1674],{"type":50,"value":1675},"InvalidOperationException",{"type":50,"value":1593},{"type":44,"tag":60,"props":1678,"children":1679},{},[1680,1685],{"type":44,"tag":112,"props":1681,"children":1682},{},[1683],{"type":50,"value":1684},"Response.Redirect()",{"type":50,"value":1686}," — compatible but behavior differs:",{"type":44,"tag":60,"props":1688,"children":1689},{},[1690],{"type":50,"value":358},{"type":44,"tag":139,"props":1692,"children":1694},{"className":361,"code":1693,"language":363,"meta":147,"style":147},"Response.Redirect(\"~\u002Fhome\");       \u002F\u002F Redirect + Response.End()\nResponse.Redirect(\"~\u002Fhome\", false); \u002F\u002F Redirect without ending\n",[1695],{"type":44,"tag":66,"props":1696,"children":1697},{"__ignoreMap":147},[1698,1706],{"type":44,"tag":369,"props":1699,"children":1700},{"class":371,"line":29},[1701],{"type":44,"tag":369,"props":1702,"children":1703},{},[1704],{"type":50,"value":1705},"Response.Redirect(\"~\u002Fhome\");       \u002F\u002F Redirect + Response.End()\n",{"type":44,"tag":369,"props":1707,"children":1708},{"class":371,"line":380},[1709],{"type":44,"tag":369,"props":1710,"children":1711},{},[1712],{"type":50,"value":1713},"Response.Redirect(\"~\u002Fhome\", false); \u002F\u002F Redirect without ending\n",{"type":44,"tag":60,"props":1715,"children":1716},{},[1717],{"type":50,"value":453},{"type":44,"tag":139,"props":1719,"children":1721},{"className":361,"code":1720,"language":363,"meta":147,"style":147},"Response.Redirect(\"\u002Fhome\");         \u002F\u002F Sets 302, does NOT abort\nreturn;                              \u002F\u002F Must explicitly return\n",[1722],{"type":44,"tag":66,"props":1723,"children":1724},{"__ignoreMap":147},[1725,1733],{"type":44,"tag":369,"props":1726,"children":1727},{"class":371,"line":29},[1728],{"type":44,"tag":369,"props":1729,"children":1730},{},[1731],{"type":50,"value":1732},"Response.Redirect(\"\u002Fhome\");         \u002F\u002F Sets 302, does NOT abort\n",{"type":44,"tag":369,"props":1734,"children":1735},{"class":371,"line":380},[1736],{"type":44,"tag":369,"props":1737,"children":1738},{},[1739],{"type":50,"value":1740},"return;                              \u002F\u002F Must explicitly return\n",{"type":44,"tag":60,"props":1742,"children":1743},{},[1744,1746,1752,1754,1759,1761,1767],{"type":50,"value":1745},"Core's ",{"type":44,"tag":66,"props":1747,"children":1749},{"className":1748},[],[1750],{"type":50,"value":1751},"Redirect",{"type":50,"value":1753}," does not end the response or call ",{"type":44,"tag":66,"props":1755,"children":1757},{"className":1756},[],[1758],{"type":50,"value":305},{"type":50,"value":1760},". Always return from the action or middleware after calling ",{"type":44,"tag":66,"props":1762,"children":1764},{"className":1763},[],[1765],{"type":50,"value":1766},"Redirect()",{"type":50,"value":1768}," to prevent further processing.",{"type":44,"tag":60,"props":1770,"children":1771},{},[1772,1777,1779,1785],{"type":44,"tag":112,"props":1773,"children":1774},{},[1775],{"type":50,"value":1776},"Response buffering",{"type":50,"value":1778}," — Core does not buffer responses by default. For scenarios requiring buffering (e.g., setting headers after partial writes), use ",{"type":44,"tag":66,"props":1780,"children":1782},{"className":1781},[],[1783],{"type":50,"value":1784},"Response.StartAsync()",{"type":50,"value":1786}," awareness or enable response buffering middleware.",{"type":44,"tag":151,"props":1788,"children":1790},{"id":1789},"step-5-replace-httpserverutility-calls",[1791],{"type":50,"value":1792},"Step 5: Replace HttpServerUtility Calls",{"type":44,"tag":60,"props":1794,"children":1795},{},[1796,1801,1803,1808],{"type":44,"tag":66,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":50,"value":204},{"type":50,"value":1802}," (",{"type":44,"tag":66,"props":1804,"children":1806},{"className":1805},[],[1807],{"type":50,"value":94},{"type":50,"value":1809},") has no single replacement in Core. Replace method by method:",{"type":44,"tag":1200,"props":1811,"children":1812},{},[1813,1835],{"type":44,"tag":1204,"props":1814,"children":1815},{},[1816],{"type":44,"tag":1208,"props":1817,"children":1818},{},[1819,1830],{"type":44,"tag":1212,"props":1820,"children":1821},{},[1822,1828],{"type":44,"tag":66,"props":1823,"children":1825},{"className":1824},[],[1826],{"type":50,"value":1827},"Server.",{"type":50,"value":1829}," Method",{"type":44,"tag":1212,"props":1831,"children":1832},{},[1833],{"type":50,"value":1834},"ASP.NET Core Replacement",{"type":44,"tag":1227,"props":1836,"children":1837},{},[1838,1875,1903,1924,1952,1980,1997,2014,2037],{"type":44,"tag":1208,"props":1839,"children":1840},{},[1841,1850],{"type":44,"tag":1234,"props":1842,"children":1843},{},[1844],{"type":44,"tag":66,"props":1845,"children":1847},{"className":1846},[],[1848],{"type":50,"value":1849},"Server.MapPath(\"~\u002Fpath\")",{"type":44,"tag":1234,"props":1851,"children":1852},{},[1853,1859,1861,1867,1869],{"type":44,"tag":66,"props":1854,"children":1856},{"className":1855},[],[1857],{"type":50,"value":1858},"IWebHostEnvironment.ContentRootPath",{"type":50,"value":1860}," or ",{"type":44,"tag":66,"props":1862,"children":1864},{"className":1863},[],[1865],{"type":50,"value":1866},".WebRootPath",{"type":50,"value":1868}," + ",{"type":44,"tag":66,"props":1870,"children":1872},{"className":1871},[],[1873],{"type":50,"value":1874},"Path.Combine()",{"type":44,"tag":1208,"props":1876,"children":1877},{},[1878,1887],{"type":44,"tag":1234,"props":1879,"children":1880},{},[1881],{"type":44,"tag":66,"props":1882,"children":1884},{"className":1883},[],[1885],{"type":50,"value":1886},"Server.HtmlEncode(s)",{"type":44,"tag":1234,"props":1888,"children":1889},{},[1890,1896,1897],{"type":44,"tag":66,"props":1891,"children":1893},{"className":1892},[],[1894],{"type":50,"value":1895},"System.Net.WebUtility.HtmlEncode(s)",{"type":50,"value":1860},{"type":44,"tag":66,"props":1898,"children":1900},{"className":1899},[],[1901],{"type":50,"value":1902},"HtmlEncoder.Default.Encode(s)",{"type":44,"tag":1208,"props":1904,"children":1905},{},[1906,1915],{"type":44,"tag":1234,"props":1907,"children":1908},{},[1909],{"type":44,"tag":66,"props":1910,"children":1912},{"className":1911},[],[1913],{"type":50,"value":1914},"Server.HtmlDecode(s)",{"type":44,"tag":1234,"props":1916,"children":1917},{},[1918],{"type":44,"tag":66,"props":1919,"children":1921},{"className":1920},[],[1922],{"type":50,"value":1923},"System.Net.WebUtility.HtmlDecode(s)",{"type":44,"tag":1208,"props":1925,"children":1926},{},[1927,1936],{"type":44,"tag":1234,"props":1928,"children":1929},{},[1930],{"type":44,"tag":66,"props":1931,"children":1933},{"className":1932},[],[1934],{"type":50,"value":1935},"Server.UrlEncode(s)",{"type":44,"tag":1234,"props":1937,"children":1938},{},[1939,1945,1946],{"type":44,"tag":66,"props":1940,"children":1942},{"className":1941},[],[1943],{"type":50,"value":1944},"System.Net.WebUtility.UrlEncode(s)",{"type":50,"value":1860},{"type":44,"tag":66,"props":1947,"children":1949},{"className":1948},[],[1950],{"type":50,"value":1951},"Uri.EscapeDataString(s)",{"type":44,"tag":1208,"props":1953,"children":1954},{},[1955,1964],{"type":44,"tag":1234,"props":1956,"children":1957},{},[1958],{"type":44,"tag":66,"props":1959,"children":1961},{"className":1960},[],[1962],{"type":50,"value":1963},"Server.UrlDecode(s)",{"type":44,"tag":1234,"props":1965,"children":1966},{},[1967,1973,1974],{"type":44,"tag":66,"props":1968,"children":1970},{"className":1969},[],[1971],{"type":50,"value":1972},"System.Net.WebUtility.UrlDecode(s)",{"type":50,"value":1860},{"type":44,"tag":66,"props":1975,"children":1977},{"className":1976},[],[1978],{"type":50,"value":1979},"Uri.UnescapeDataString(s)",{"type":44,"tag":1208,"props":1981,"children":1982},{},[1983,1992],{"type":44,"tag":1234,"props":1984,"children":1985},{},[1986],{"type":44,"tag":66,"props":1987,"children":1989},{"className":1988},[],[1990],{"type":50,"value":1991},"Server.Transfer(url)",{"type":44,"tag":1234,"props":1993,"children":1994},{},[1995],{"type":50,"value":1996},"No equivalent — rewrite as redirect or internal rewrite middleware",{"type":44,"tag":1208,"props":1998,"children":1999},{},[2000,2009],{"type":44,"tag":1234,"props":2001,"children":2002},{},[2003],{"type":44,"tag":66,"props":2004,"children":2006},{"className":2005},[],[2007],{"type":50,"value":2008},"Server.Execute(url)",{"type":44,"tag":1234,"props":2010,"children":2011},{},[2012],{"type":50,"value":2013},"No equivalent — refactor to call the target logic directly",{"type":44,"tag":1208,"props":2015,"children":2016},{},[2017,2026],{"type":44,"tag":1234,"props":2018,"children":2019},{},[2020],{"type":44,"tag":66,"props":2021,"children":2023},{"className":2022},[],[2024],{"type":50,"value":2025},"Server.GetLastError()",{"type":44,"tag":1234,"props":2027,"children":2028},{},[2029,2035],{"type":44,"tag":66,"props":2030,"children":2032},{"className":2031},[],[2033],{"type":50,"value":2034},"IExceptionHandlerFeature",{"type":50,"value":2036}," in exception handler middleware",{"type":44,"tag":1208,"props":2038,"children":2039},{},[2040,2049],{"type":44,"tag":1234,"props":2041,"children":2042},{},[2043],{"type":44,"tag":66,"props":2044,"children":2046},{"className":2045},[],[2047],{"type":50,"value":2048},"Server.ScriptTimeout",{"type":44,"tag":1234,"props":2050,"children":2051},{},[2052,2058,2059,2065],{"type":44,"tag":66,"props":2053,"children":2055},{"className":2054},[],[2056],{"type":50,"value":2057},"RequestTimeoutOptions",{"type":50,"value":1860},{"type":44,"tag":66,"props":2060,"children":2062},{"className":2061},[],[2063],{"type":50,"value":2064},"CancellationToken",{"type":50,"value":2066}," with timeout",{"type":44,"tag":60,"props":2068,"children":2069},{},[2070,2072,2077,2079,2085],{"type":50,"value":2071},"For ",{"type":44,"tag":66,"props":2073,"children":2075},{"className":2074},[],[2076],{"type":50,"value":219},{"type":50,"value":2078},", inject ",{"type":44,"tag":66,"props":2080,"children":2082},{"className":2081},[],[2083],{"type":50,"value":2084},"IWebHostEnvironment",{"type":50,"value":544},{"type":44,"tag":60,"props":2087,"children":2088},{},[2089],{"type":50,"value":358},{"type":44,"tag":139,"props":2091,"children":2093},{"className":361,"code":2092,"language":363,"meta":147,"style":147},"string path = HttpContext.Current.Server.MapPath(\"~\u002FContent\u002Fdata.json\");\n",[2094],{"type":44,"tag":66,"props":2095,"children":2096},{"__ignoreMap":147},[2097],{"type":44,"tag":369,"props":2098,"children":2099},{"class":371,"line":29},[2100],{"type":44,"tag":369,"props":2101,"children":2102},{},[2103],{"type":50,"value":2092},{"type":44,"tag":60,"props":2105,"children":2106},{},[2107],{"type":50,"value":453},{"type":44,"tag":139,"props":2109,"children":2111},{"className":361,"code":2110,"language":363,"meta":147,"style":147},"public class DataService\n{\n    private readonly IWebHostEnvironment _env;\n\n    public DataService(IWebHostEnvironment env)\n    {\n        _env = env;\n    }\n\n    public string GetDataPath()\n    {\n        return Path.Combine(_env.WebRootPath, \"Content\", \"data.json\");\n    }\n}\n",[2112],{"type":44,"tag":66,"props":2113,"children":2114},{"__ignoreMap":147},[2115,2123,2130,2138,2145,2153,2160,2168,2175,2182,2190,2197,2205,2212],{"type":44,"tag":369,"props":2116,"children":2117},{"class":371,"line":29},[2118],{"type":44,"tag":369,"props":2119,"children":2120},{},[2121],{"type":50,"value":2122},"public class DataService\n",{"type":44,"tag":369,"props":2124,"children":2125},{"class":371,"line":380},[2126],{"type":44,"tag":369,"props":2127,"children":2128},{},[2129],{"type":50,"value":386},{"type":44,"tag":369,"props":2131,"children":2132},{"class":371,"line":389},[2133],{"type":44,"tag":369,"props":2134,"children":2135},{},[2136],{"type":50,"value":2137},"    private readonly IWebHostEnvironment _env;\n",{"type":44,"tag":369,"props":2139,"children":2140},{"class":371,"line":398},[2141],{"type":44,"tag":369,"props":2142,"children":2143},{"emptyLinePlaceholder":646},[2144],{"type":50,"value":649},{"type":44,"tag":369,"props":2146,"children":2147},{"class":371,"line":407},[2148],{"type":44,"tag":369,"props":2149,"children":2150},{},[2151],{"type":50,"value":2152},"    public DataService(IWebHostEnvironment env)\n",{"type":44,"tag":369,"props":2154,"children":2155},{"class":371,"line":416},[2156],{"type":44,"tag":369,"props":2157,"children":2158},{},[2159],{"type":50,"value":404},{"type":44,"tag":369,"props":2161,"children":2162},{"class":371,"line":25},[2163],{"type":44,"tag":369,"props":2164,"children":2165},{},[2166],{"type":50,"value":2167},"        _env = env;\n",{"type":44,"tag":369,"props":2169,"children":2170},{"class":371,"line":433},[2171],{"type":44,"tag":369,"props":2172,"children":2173},{},[2174],{"type":50,"value":439},{"type":44,"tag":369,"props":2176,"children":2177},{"class":371,"line":442},[2178],{"type":44,"tag":369,"props":2179,"children":2180},{"emptyLinePlaceholder":646},[2181],{"type":50,"value":649},{"type":44,"tag":369,"props":2183,"children":2184},{"class":371,"line":689},[2185],{"type":44,"tag":369,"props":2186,"children":2187},{},[2188],{"type":50,"value":2189},"    public string GetDataPath()\n",{"type":44,"tag":369,"props":2191,"children":2192},{"class":371,"line":697},[2193],{"type":44,"tag":369,"props":2194,"children":2195},{},[2196],{"type":50,"value":404},{"type":44,"tag":369,"props":2198,"children":2199},{"class":371,"line":705},[2200],{"type":44,"tag":369,"props":2201,"children":2202},{},[2203],{"type":50,"value":2204},"        return Path.Combine(_env.WebRootPath, \"Content\", \"data.json\");\n",{"type":44,"tag":369,"props":2206,"children":2207},{"class":371,"line":714},[2208],{"type":44,"tag":369,"props":2209,"children":2210},{},[2211],{"type":50,"value":439},{"type":44,"tag":369,"props":2213,"children":2214},{"class":371,"line":722},[2215],{"type":44,"tag":369,"props":2216,"children":2217},{},[2218],{"type":50,"value":448},{"type":44,"tag":151,"props":2220,"children":2222},{"id":2221},"step-6-migrate-claimsprincipalcurrent",[2223],{"type":50,"value":2224},"Step 6: Migrate ClaimsPrincipal.Current",{"type":44,"tag":60,"props":2226,"children":2227},{},[2228,2233],{"type":44,"tag":66,"props":2229,"children":2231},{"className":2230},[],[2232],{"type":50,"value":251},{"type":50,"value":2234}," is a static thread-based accessor that does not work reliably in ASP.NET Core's async pipeline.",{"type":44,"tag":60,"props":2236,"children":2237},{},[2238,2242,2243,2249],{"type":44,"tag":112,"props":2239,"children":2240},{},[2241],{"type":50,"value":343},{"type":50,"value":345},{"type":44,"tag":66,"props":2244,"children":2246},{"className":2245},[],[2247],{"type":50,"value":2248},"User",{"type":50,"value":2250}," property:",{"type":44,"tag":60,"props":2252,"children":2253},{},[2254],{"type":50,"value":358},{"type":44,"tag":139,"props":2256,"children":2258},{"className":361,"code":2257,"language":363,"meta":147,"style":147},"var claims = ClaimsPrincipal.Current.Claims;\n",[2259],{"type":44,"tag":66,"props":2260,"children":2261},{"__ignoreMap":147},[2262],{"type":44,"tag":369,"props":2263,"children":2264},{"class":371,"line":29},[2265],{"type":44,"tag":369,"props":2266,"children":2267},{},[2268],{"type":50,"value":2257},{"type":44,"tag":60,"props":2270,"children":2271},{},[2272],{"type":50,"value":453},{"type":44,"tag":139,"props":2274,"children":2276},{"className":361,"code":2275,"language":363,"meta":147,"style":147},"var claims = User.Claims;\n",[2277],{"type":44,"tag":66,"props":2278,"children":2279},{"__ignoreMap":147},[2280],{"type":44,"tag":369,"props":2281,"children":2282},{"class":371,"line":29},[2283],{"type":44,"tag":369,"props":2284,"children":2285},{},[2286],{"type":50,"value":2275},{"type":44,"tag":60,"props":2288,"children":2289},{},[2290,2295,2296,2301],{"type":44,"tag":112,"props":2291,"children":2292},{},[2293],{"type":50,"value":2294},"In services",{"type":50,"value":536},{"type":44,"tag":66,"props":2297,"children":2299},{"className":2298},[],[2300],{"type":50,"value":542},{"type":50,"value":544},{"type":44,"tag":60,"props":2303,"children":2304},{},[2305],{"type":50,"value":358},{"type":44,"tag":139,"props":2307,"children":2309},{"className":361,"code":2308,"language":363,"meta":147,"style":147},"public class PermissionService\n{\n    public bool HasRole(string role)\n    {\n        return ClaimsPrincipal.Current.IsInRole(role);\n    }\n}\n",[2310],{"type":44,"tag":66,"props":2311,"children":2312},{"__ignoreMap":147},[2313,2321,2328,2336,2343,2351,2358],{"type":44,"tag":369,"props":2314,"children":2315},{"class":371,"line":29},[2316],{"type":44,"tag":369,"props":2317,"children":2318},{},[2319],{"type":50,"value":2320},"public class PermissionService\n",{"type":44,"tag":369,"props":2322,"children":2323},{"class":371,"line":380},[2324],{"type":44,"tag":369,"props":2325,"children":2326},{},[2327],{"type":50,"value":386},{"type":44,"tag":369,"props":2329,"children":2330},{"class":371,"line":389},[2331],{"type":44,"tag":369,"props":2332,"children":2333},{},[2334],{"type":50,"value":2335},"    public bool HasRole(string role)\n",{"type":44,"tag":369,"props":2337,"children":2338},{"class":371,"line":398},[2339],{"type":44,"tag":369,"props":2340,"children":2341},{},[2342],{"type":50,"value":404},{"type":44,"tag":369,"props":2344,"children":2345},{"class":371,"line":407},[2346],{"type":44,"tag":369,"props":2347,"children":2348},{},[2349],{"type":50,"value":2350},"        return ClaimsPrincipal.Current.IsInRole(role);\n",{"type":44,"tag":369,"props":2352,"children":2353},{"class":371,"line":416},[2354],{"type":44,"tag":369,"props":2355,"children":2356},{},[2357],{"type":50,"value":439},{"type":44,"tag":369,"props":2359,"children":2360},{"class":371,"line":25},[2361],{"type":44,"tag":369,"props":2362,"children":2363},{},[2364],{"type":50,"value":448},{"type":44,"tag":60,"props":2366,"children":2367},{},[2368],{"type":50,"value":453},{"type":44,"tag":139,"props":2370,"children":2372},{"className":361,"code":2371,"language":363,"meta":147,"style":147},"public class PermissionService\n{\n    private readonly IHttpContextAccessor _accessor;\n\n    public PermissionService(IHttpContextAccessor accessor)\n    {\n        _accessor = accessor;\n    }\n\n    public bool HasRole(string role)\n    {\n        return _accessor.HttpContext?.User.IsInRole(role) ?? false;\n    }\n}\n",[2373],{"type":44,"tag":66,"props":2374,"children":2375},{"__ignoreMap":147},[2376,2383,2390,2398,2405,2413,2420,2428,2435,2442,2449,2456,2464,2471],{"type":44,"tag":369,"props":2377,"children":2378},{"class":371,"line":29},[2379],{"type":44,"tag":369,"props":2380,"children":2381},{},[2382],{"type":50,"value":2320},{"type":44,"tag":369,"props":2384,"children":2385},{"class":371,"line":380},[2386],{"type":44,"tag":369,"props":2387,"children":2388},{},[2389],{"type":50,"value":386},{"type":44,"tag":369,"props":2391,"children":2392},{"class":371,"line":389},[2393],{"type":44,"tag":369,"props":2394,"children":2395},{},[2396],{"type":50,"value":2397},"    private readonly IHttpContextAccessor _accessor;\n",{"type":44,"tag":369,"props":2399,"children":2400},{"class":371,"line":398},[2401],{"type":44,"tag":369,"props":2402,"children":2403},{"emptyLinePlaceholder":646},[2404],{"type":50,"value":649},{"type":44,"tag":369,"props":2406,"children":2407},{"class":371,"line":407},[2408],{"type":44,"tag":369,"props":2409,"children":2410},{},[2411],{"type":50,"value":2412},"    public PermissionService(IHttpContextAccessor accessor)\n",{"type":44,"tag":369,"props":2414,"children":2415},{"class":371,"line":416},[2416],{"type":44,"tag":369,"props":2417,"children":2418},{},[2419],{"type":50,"value":404},{"type":44,"tag":369,"props":2421,"children":2422},{"class":371,"line":25},[2423],{"type":44,"tag":369,"props":2424,"children":2425},{},[2426],{"type":50,"value":2427},"        _accessor = accessor;\n",{"type":44,"tag":369,"props":2429,"children":2430},{"class":371,"line":433},[2431],{"type":44,"tag":369,"props":2432,"children":2433},{},[2434],{"type":50,"value":439},{"type":44,"tag":369,"props":2436,"children":2437},{"class":371,"line":442},[2438],{"type":44,"tag":369,"props":2439,"children":2440},{"emptyLinePlaceholder":646},[2441],{"type":50,"value":649},{"type":44,"tag":369,"props":2443,"children":2444},{"class":371,"line":689},[2445],{"type":44,"tag":369,"props":2446,"children":2447},{},[2448],{"type":50,"value":2335},{"type":44,"tag":369,"props":2450,"children":2451},{"class":371,"line":697},[2452],{"type":44,"tag":369,"props":2453,"children":2454},{},[2455],{"type":50,"value":404},{"type":44,"tag":369,"props":2457,"children":2458},{"class":371,"line":705},[2459],{"type":44,"tag":369,"props":2460,"children":2461},{},[2462],{"type":50,"value":2463},"        return _accessor.HttpContext?.User.IsInRole(role) ?? false;\n",{"type":44,"tag":369,"props":2465,"children":2466},{"class":371,"line":714},[2467],{"type":44,"tag":369,"props":2468,"children":2469},{},[2470],{"type":50,"value":439},{"type":44,"tag":369,"props":2472,"children":2473},{"class":371,"line":722},[2474],{"type":44,"tag":369,"props":2475,"children":2476},{},[2477],{"type":50,"value":448},{"type":44,"tag":60,"props":2479,"children":2480},{},[2481,2483,2489,2491,2496,2498,2504],{"type":50,"value":2482},"Custom ",{"type":44,"tag":66,"props":2484,"children":2486},{"className":2485},[],[2487],{"type":50,"value":2488},"ClaimsPrincipal",{"type":50,"value":2490}," factories that set ",{"type":44,"tag":66,"props":2492,"children":2494},{"className":2493},[],[2495],{"type":50,"value":251},{"type":50,"value":2497}," should be replaced with claims transformation. Register an ",{"type":44,"tag":66,"props":2499,"children":2501},{"className":2500},[],[2502],{"type":50,"value":2503},"IClaimsTransformation",{"type":50,"value":2505}," implementation:",{"type":44,"tag":139,"props":2507,"children":2509},{"className":361,"code":2508,"language":363,"meta":147,"style":147},"builder.Services.AddTransient\u003CIClaimsTransformation, CustomClaimsTransformation>();\n",[2510],{"type":44,"tag":66,"props":2511,"children":2512},{"__ignoreMap":147},[2513],{"type":44,"tag":369,"props":2514,"children":2515},{"class":371,"line":29},[2516],{"type":44,"tag":369,"props":2517,"children":2518},{},[2519],{"type":50,"value":2508},{"type":44,"tag":151,"props":2521,"children":2523},{"id":2522},"step-7-remove-legacy-references",[2524],{"type":50,"value":2525},"Step 7: Remove Legacy References",{"type":44,"tag":60,"props":2527,"children":2528},{},[2529],{"type":50,"value":2530},"Remove all legacy HttpContext artifacts:",{"type":44,"tag":163,"props":2532,"children":2533},{},[2534,2547,2567,2578],{"type":44,"tag":167,"props":2535,"children":2536},{},[2537,2539,2545],{"type":50,"value":2538},"Remove ",{"type":44,"tag":66,"props":2540,"children":2542},{"className":2541},[],[2543],{"type":50,"value":2544},"using System.Web",{"type":50,"value":2546}," statements that are no longer needed",{"type":44,"tag":167,"props":2548,"children":2549},{},[2550,2552,2558,2559,2565],{"type":50,"value":2551},"Remove any custom ",{"type":44,"tag":66,"props":2553,"children":2555},{"className":2554},[],[2556],{"type":50,"value":2557},"HttpContextBase",{"type":50,"value":187},{"type":44,"tag":66,"props":2560,"children":2562},{"className":2561},[],[2563],{"type":50,"value":2564},"HttpContextWrapper",{"type":50,"value":2566}," abstractions",{"type":44,"tag":167,"props":2568,"children":2569},{},[2570,2571,2576],{"type":50,"value":2538},{"type":44,"tag":66,"props":2572,"children":2574},{"className":2573},[],[2575],{"type":50,"value":71},{"type":50,"value":2577}," shim or facade classes",{"type":44,"tag":167,"props":2579,"children":2580},{},[2581,2583,2588,2589,2594,2595,2600,2601,2606,2607,2613,2615],{"type":50,"value":2582},"Search for remaining references to ",{"type":44,"tag":66,"props":2584,"children":2586},{"className":2585},[],[2587],{"type":50,"value":71},{"type":50,"value":73},{"type":44,"tag":66,"props":2590,"children":2592},{"className":2591},[],[2593],{"type":50,"value":251},{"type":50,"value":73},{"type":44,"tag":66,"props":2596,"children":2598},{"className":2597},[],[2599],{"type":50,"value":94},{"type":50,"value":73},{"type":44,"tag":66,"props":2602,"children":2604},{"className":2603},[],[2605],{"type":50,"value":287},{"type":50,"value":73},{"type":44,"tag":66,"props":2608,"children":2610},{"className":2609},[],[2611],{"type":50,"value":2612},"Response.Write(",{"type":50,"value":2614}," (sync overload), and ",{"type":44,"tag":66,"props":2616,"children":2618},{"className":2617},[],[2619],{"type":50,"value":305},{"type":44,"tag":53,"props":2621,"children":2623},{"id":2622},"success-criteria",[2624],{"type":50,"value":2625},"Success Criteria",{"type":44,"tag":163,"props":2627,"children":2628},{},[2629,2641,2656,2668,2688,2711,2726,2736,2758,2770,2775],{"type":44,"tag":167,"props":2630,"children":2631},{},[2632,2634,2639],{"type":50,"value":2633},"No references to ",{"type":44,"tag":66,"props":2635,"children":2637},{"className":2636},[],[2638],{"type":50,"value":71},{"type":50,"value":2640}," remain in the project",{"type":44,"tag":167,"props":2642,"children":2643},{},[2644,2649,2651],{"type":44,"tag":66,"props":2645,"children":2647},{"className":2646},[],[2648],{"type":50,"value":542},{"type":50,"value":2650}," registered and injected where services need ",{"type":44,"tag":66,"props":2652,"children":2654},{"className":2653},[],[2655],{"type":50,"value":351},{"type":44,"tag":167,"props":2657,"children":2658},{},[2659,2661,2666],{"type":50,"value":2660},"No singleton services cache ",{"type":44,"tag":66,"props":2662,"children":2664},{"className":2663},[],[2665],{"type":50,"value":351},{"type":50,"value":2667}," references in fields",{"type":44,"tag":167,"props":2669,"children":2670},{},[2671,2673,2678,2680,2686],{"type":50,"value":2672},"All ",{"type":44,"tag":66,"props":2674,"children":2676},{"className":2675},[],[2677],{"type":50,"value":273},{"type":50,"value":2679}," reads converted to async ",{"type":44,"tag":66,"props":2681,"children":2683},{"className":2682},[],[2684],{"type":50,"value":2685},"Request.Body",{"type":50,"value":2687}," reads",{"type":44,"tag":167,"props":2689,"children":2690},{},[2691,2692,2697,2699,2705,2706],{"type":50,"value":2672},{"type":44,"tag":66,"props":2693,"children":2695},{"className":2694},[],[2696],{"type":50,"value":298},{"type":50,"value":2698}," calls converted to ",{"type":44,"tag":66,"props":2700,"children":2702},{"className":2701},[],[2703],{"type":50,"value":2704},"await Response.WriteAsync()",{"type":50,"value":1860},{"type":44,"tag":66,"props":2707,"children":2709},{"className":2708},[],[2710],{"type":50,"value":1478},{"type":44,"tag":167,"props":2712,"children":2713},{},[2714,2719,2721],{"type":44,"tag":66,"props":2715,"children":2717},{"className":2716},[],[2718],{"type":50,"value":305},{"type":50,"value":2720}," calls removed and replaced with return statements or ",{"type":44,"tag":66,"props":2722,"children":2724},{"className":2723},[],[2725],{"type":50,"value":1591},{"type":44,"tag":167,"props":2727,"children":2728},{},[2729,2734],{"type":44,"tag":66,"props":2730,"children":2732},{"className":2731},[],[2733],{"type":50,"value":94},{"type":50,"value":2735}," calls replaced with Core equivalents",{"type":44,"tag":167,"props":2737,"children":2738},{},[2739,2744,2746,2751,2753],{"type":44,"tag":66,"props":2740,"children":2742},{"className":2741},[],[2743],{"type":50,"value":251},{"type":50,"value":2745}," replaced with ",{"type":44,"tag":66,"props":2747,"children":2749},{"className":2748},[],[2750],{"type":50,"value":2248},{"type":50,"value":2752}," property or ",{"type":44,"tag":66,"props":2754,"children":2756},{"className":2755},[],[2757],{"type":50,"value":542},{"type":44,"tag":167,"props":2759,"children":2760},{},[2761,2763,2768],{"type":50,"value":2762},"No ",{"type":44,"tag":66,"props":2764,"children":2766},{"className":2765},[],[2767],{"type":50,"value":287},{"type":50,"value":2769}," access remains",{"type":44,"tag":167,"props":2771,"children":2772},{},[2773],{"type":50,"value":2774},"Headers set before writing to response body",{"type":44,"tag":167,"props":2776,"children":2777},{},[2778],{"type":50,"value":2779},"Project builds without errors",{"type":44,"tag":2781,"props":2782,"children":2783},"style",{},[2784],{"type":50,"value":2785},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2787,"total":2881},[2788,2798,2812,2829,2839,2852,2869],{"slug":2789,"name":2789,"fn":2790,"description":2791,"org":2792,"tags":2793,"stars":25,"repoUrl":26,"updatedAt":2797},"converting-to-cpm","migrate .NET projects to Central Package Management","Converts .NET projects and solutions to NuGet Central Package Management (CPM) with Directory.Packages.props. Use when the user wants to centralize, convert, align, or sync NuGet package versions across multiple projects, resolve version conflicts or mismatches, or get versions consistent across a solution or repository. Also triggers when packages are out of sync or drifting across projects.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2794,2795,2796],{"name":20,"slug":21,"type":15},{"name":9,"slug":8,"type":15},{"name":23,"slug":24,"type":15},"2026-07-18T05:14:13.971821",{"slug":2799,"name":2799,"fn":2800,"description":2801,"org":2802,"tags":2803,"stars":25,"repoUrl":26,"updatedAt":2811},"creating-winforms-custom-controls","create custom WinForms controls","Creates custom controls and UserControls for modern WinForms (.NET 6+). Use when deriving from Control, UserControl, Button, TextBox, or other base controls, implementing custom rendering with OnPaint overrides, creating composite controls with child control composition, adding custom properties with [Browsable], [Category], or [DefaultValue] attributes for Designer support, implementing INotifyPropertyChanged for control properties, handling Layout\u002FLayoutEngine for custom sizing, creating scrollable controls with AutoScrollMinSize, implementing dark mode theming, or building List\u002FGrid\u002FTree-like controls. Also triggers for \"custom UserControl\", \"derive from Control\", \"owner-drawn control\", \"Designer properties\", \"[Browsable] attribute\", \"custom WinForms control\", \"LayoutEngine\", \"AutoScroll control\", and \"themed control\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2804,2805,2808],{"name":20,"slug":21,"type":15},{"name":2806,"slug":2807,"type":15},"Windows","windows",{"name":2809,"slug":2810,"type":15},"WinUI","winui","2026-07-03T16:31:30.1325",{"slug":2813,"name":2813,"fn":2814,"description":2815,"org":2816,"tags":2817,"stars":25,"repoUrl":26,"updatedAt":2828},"managing-winforms-high-dpi-layout","design high-DPI responsive WinForms layouts","Implements WinForms high-DPI fluent layouts using TableLayoutPanel, FlowLayoutPanel, and DPI-aware design patterns. Use when creating responsive form layouts that must scale across different DPI settings, implementing Per Monitor V2 (PerMonitorV2) DPI awareness, working with TableLayoutPanel.RowStyles\u002FColumnStyles, using FlowLayoutPanel for dynamic layouts, replacing fixed pixel positioning with container-based layout, troubleshooting DPI scaling issues, or structuring nested layout containers. Also triggers for \"TableLayoutPanel\", \"FlowLayoutPanel\", \"high DPI WinForms\", \"PerMonitorV2\", \"DPI aware layout\", \"responsive WinForms\", \"scale UI\", \"AutoScaleMode\", and \"DPI scaling\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2818,2821,2824,2827],{"name":2819,"slug":2820,"type":15},"Design","design",{"name":2822,"slug":2823,"type":15},"Desktop","desktop",{"name":2825,"slug":2826,"type":15},"UI Components","ui-components",{"name":2806,"slug":2807,"type":15},"2026-07-18T05:14:12.982806",{"slug":2830,"name":2830,"fn":2831,"description":2832,"org":2833,"tags":2834,"stars":25,"repoUrl":26,"updatedAt":2838},"managing-winforms-mvvm","implement MVVM pattern in WinForms","Implements MVVM pattern in WinForms applications (.NET 8+) with ViewModels, Commands, and DataContext. Use when user explicitly requests MVVM implementation, setting up ViewModel with INotifyPropertyChanged or ObservableObject, implementing ICommand or RelayCommand, wiring Form.DataContext, binding controls to ViewModel properties, creating Commands for button clicks, or separating business logic from UI code. Also triggers for \"WinForms MVVM\", \"ViewModel in WinForms\", \"INotifyPropertyChanged\", \"DataContext binding\", \"Command pattern WinForms\", \"ObservableObject\", \"RelayCommand\", and \"testable WinForms\". Also use when fixing existing MVVM code or when guided by winforms-feature-adoption scenario. DO NOT USE FOR: automatic application during version upgrades (opt-in only).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2835,2836,2837],{"name":20,"slug":21,"type":15},{"name":2806,"slug":2807,"type":15},{"name":2809,"slug":2810,"type":15},"2026-07-18T05:14:11.951511",{"slug":2840,"name":2840,"fn":2841,"description":2842,"org":2843,"tags":2844,"stars":25,"repoUrl":26,"updatedAt":2851},"migrating-aspnet-framework-to-core","migrate ASP.NET Framework to Core","Orchestrates migration of ASP.NET Framework (System.Web) MVC and WebAPI projects to ASP.NET Core. Covers only old .NET Framework web projects — not applicable to ASP.NET Core or modern .NET web projects (those are already on the target stack). Defines the ordered phase sequence (project file, host, config, DI, controllers, middleware, auth, views, cleanup), satellite skill dispatch, and migration unit breakdown for both in-place and side-by-side modes. Use when executing a task that upgrades a project with System.Web dependencies, HttpModules, HttpHandlers, MVC controllers, WebAPI controllers, or Global.asax. Also triggers for \"migrate ASP.NET to Core\", \"upgrade MVC project\", \"convert WebAPI to ASP.NET Core\". Not applicable to class libraries unless they directly reference System.Web.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2845,2846,2849,2850],{"name":20,"slug":21,"type":15},{"name":2847,"slug":2848,"type":15},"ASP.NET Core","asp-net-core",{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},"2026-07-03T16:30:55.581898",{"slug":2853,"name":2853,"fn":2854,"description":2855,"org":2856,"tags":2857,"stars":25,"repoUrl":26,"updatedAt":2868},"migrating-documentdb-to-cosmos","migrate DocumentDB to Cosmos DB","Migrates from the deprecated Microsoft.Azure.DocumentDB SDK (V2) to the modern Microsoft.Azure.Cosmos SDK (V3) for Azure Cosmos DB. Use ONLY when Microsoft.Azure.DocumentDB has been flagged as deprecated or obsolete and must be replaced — not for version-bump scenarios where the V2 SDK is still supported.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2858,2861,2864,2867],{"name":2859,"slug":2860,"type":15},"Azure","azure",{"name":2862,"slug":2863,"type":15},"Cosmos DB","cosmos-db",{"name":2865,"slug":2866,"type":15},"Database","database",{"name":23,"slug":24,"type":15},"2026-07-03T16:31:21.932144",{"slug":2870,"name":2870,"fn":2871,"description":2872,"org":2873,"tags":2874,"stars":25,"repoUrl":26,"updatedAt":2880},"migrating-global-asax","migrate Global.asax to ASP.NET Core middleware","Migrates Global.asax application lifecycle events to ASP.NET Core middleware, startup configuration, and Program.cs. Use when upgrading ASP.NET Framework apps containing Global.asax or Global.asax.cs files. Triggers for \"migrate Global.asax\", \"convert application events\", \"move Application_Start to Program.cs\", \"replace Global.asax with middleware\", and ASP.NET-to-Core migration involving request lifecycle, error handling, or session management.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2875,2877,2878,2879],{"name":2847,"slug":2876,"type":15},"aspnet-core",{"name":9,"slug":8,"type":15},{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},"2026-07-07T06:54:34.226435",19,{"items":2883,"total":3070},[2884,2906,2923,2944,2959,2976,2987,3000,3015,3030,3045,3058],{"slug":2885,"name":2885,"fn":2886,"description":2887,"org":2888,"tags":2889,"stars":2903,"repoUrl":2904,"updatedAt":2905},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2890,2893,2896,2897,2900],{"name":2891,"slug":2892,"type":15},"Engineering","engineering",{"name":2894,"slug":2895,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":2898,"slug":2899,"type":15},"Project Management","project-management",{"name":2901,"slug":2902,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":2907,"name":2907,"fn":2908,"description":2909,"org":2910,"tags":2911,"stars":2920,"repoUrl":2921,"updatedAt":2922},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2912,2913,2916,2917],{"name":20,"slug":21,"type":15},{"name":2914,"slug":2915,"type":15},"Agents","agents",{"name":2859,"slug":2860,"type":15},{"name":2918,"slug":2919,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":2924,"name":2924,"fn":2925,"description":2926,"org":2927,"tags":2928,"stars":2920,"repoUrl":2921,"updatedAt":2943},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2929,2932,2933,2936,2939,2940],{"name":2930,"slug":2931,"type":15},"Analytics","analytics",{"name":2859,"slug":2860,"type":15},{"name":2934,"slug":2935,"type":15},"Data Analysis","data-analysis",{"name":2937,"slug":2938,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":2941,"slug":2942,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":2945,"name":2945,"fn":2946,"description":2947,"org":2948,"tags":2949,"stars":2920,"repoUrl":2921,"updatedAt":2958},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2950,2953,2954,2955],{"name":2951,"slug":2952,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2859,"slug":2860,"type":15},{"name":2937,"slug":2938,"type":15},{"name":2956,"slug":2957,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":2960,"name":2960,"fn":2961,"description":2962,"org":2963,"tags":2964,"stars":2920,"repoUrl":2921,"updatedAt":2975},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2965,2966,2969,2970,2971,2974],{"name":2859,"slug":2860,"type":15},{"name":2967,"slug":2968,"type":15},"Compliance","compliance",{"name":2918,"slug":2919,"type":15},{"name":9,"slug":8,"type":15},{"name":2972,"slug":2973,"type":15},"Python","python",{"name":2956,"slug":2957,"type":15},"2026-07-18T05:14:23.017504",{"slug":2977,"name":2977,"fn":2978,"description":2979,"org":2980,"tags":2981,"stars":2920,"repoUrl":2921,"updatedAt":2986},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2982,2983,2984,2985],{"name":2930,"slug":2931,"type":15},{"name":2859,"slug":2860,"type":15},{"name":2918,"slug":2919,"type":15},{"name":2972,"slug":2973,"type":15},"2026-07-31T05:54:29.068751",{"slug":2988,"name":2988,"fn":2989,"description":2990,"org":2991,"tags":2992,"stars":2920,"repoUrl":2921,"updatedAt":2999},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2993,2996,2997,2998],{"name":2994,"slug":2995,"type":15},"API Development","api-development",{"name":2859,"slug":2860,"type":15},{"name":9,"slug":8,"type":15},{"name":2972,"slug":2973,"type":15},"2026-07-18T05:14:16.988376",{"slug":3001,"name":3001,"fn":3002,"description":3003,"org":3004,"tags":3005,"stars":2920,"repoUrl":2921,"updatedAt":3014},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3006,3007,3010,3013],{"name":2859,"slug":2860,"type":15},{"name":3008,"slug":3009,"type":15},"Computer Vision","computer-vision",{"name":3011,"slug":3012,"type":15},"Images","images",{"name":2972,"slug":2973,"type":15},"2026-07-18T05:14:18.007737",{"slug":3016,"name":3016,"fn":3017,"description":3018,"org":3019,"tags":3020,"stars":2920,"repoUrl":2921,"updatedAt":3029},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3021,3022,3025,3028],{"name":2859,"slug":2860,"type":15},{"name":3023,"slug":3024,"type":15},"Configuration","configuration",{"name":3026,"slug":3027,"type":15},"Feature Flags","feature-flags",{"name":2937,"slug":2938,"type":15},"2026-07-03T16:32:01.278468",{"slug":3031,"name":3031,"fn":3032,"description":3033,"org":3034,"tags":3035,"stars":2920,"repoUrl":2921,"updatedAt":3044},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3036,3037,3038,3041],{"name":2862,"slug":2863,"type":15},{"name":2865,"slug":2866,"type":15},{"name":3039,"slug":3040,"type":15},"NoSQL","nosql",{"name":3042,"slug":3043,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":3046,"name":3046,"fn":3032,"description":3047,"org":3048,"tags":3049,"stars":2920,"repoUrl":2921,"updatedAt":3057},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3050,3051,3052,3053,3054],{"name":2862,"slug":2863,"type":15},{"name":2865,"slug":2866,"type":15},{"name":9,"slug":8,"type":15},{"name":3039,"slug":3040,"type":15},{"name":3055,"slug":3056,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":3059,"name":3059,"fn":3060,"description":3061,"org":3062,"tags":3063,"stars":2920,"repoUrl":2921,"updatedAt":3069},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3064,3065,3066,3067,3068],{"name":2859,"slug":2860,"type":15},{"name":2862,"slug":2863,"type":15},{"name":2865,"slug":2866,"type":15},{"name":2937,"slug":2938,"type":15},{"name":3039,"slug":3040,"type":15},"2026-05-13T06:14:17.582229",267]