# ASP.NET Core modify post request data ###### tags: `C#` 有時會想在 middleware 統一對 request 資料做些修改,或變更 router 路徑,可以這麼做 ```csharp using Newtonsoft.Json; using System.Net; using System.Text; public class UserDefineMiddleware { private readonly RequestDelegate _next; public UserDefineMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext httpContext) { var path = httpContext.Request.Path.ToString().ToLower(); if (!path.Contains("/api/wallet")) { await _next(httpContext); return; } //讀取本來的 request httpContext.Request.EnableBuffering(); using var sr = new StreamReader(httpContext.Request.Body, Encoding.UTF8); var body = await sr.ReadToEndAsync(); var dataSource = JsonConvert.DeserializeObject<RequestDto>(body); if (dataSource == null) { httpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest; return; } //修改 request 內容並重新塞回去 dataSource.name = dataSource.name.Towlower(); var jsonString = JsonConvert.SerializeObject(dataSource); var requestContent = new StringContent(jsonString, Encoding.UTF8, "application/json"); httpContext.Request.Body = await requestContent.ReadAsStreamAsync(); //重新 router 路徑 httpContext.Request.Path = $"/aaa/test"; httpContext.Request.Body.Position = 0; await _next(httpContext); } } ``` ### read form data from request ```csharp if (context.Request.HasFormContentType) { IFormCollection form; form = context.Request.Form; // sync // Or form = await context.Request.ReadFormAsync(); // async string param1 = form["param1"]; string param2 = form["param2"]; } ``` ### 相關連結 [ASP.NET Core modify/substitute request body](https://stackoverflow.com/a/44500627/19304838) [.Net Core Middleware - Getting Form Data from Request](https://stackoverflow.com/a/56056862/19304838)