# 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)