ASP.NET Core modify/substitute request body
Take the request body, read its content, make whatever changes are necessary if at all, then create a new stream to pass down the pipeline. Once accessed, the request stream has to be replaced.
public async Task Invoke(HttpContext context) {
var request = context.Request;
if (request.Path.Value.Contains("DataSourceResult")) {
//get the request body and put it back for the downstream items to read
var stream = request.Body;// currently holds the original stream
var originalContent = new StreamReader(stream).ReadToEnd();
var notModified = true;
try {
var dataSource = JsonConvert.DeserializeObject<DataSourceRequest>(originalContent);
if (dataSource != null && dataSource.Take > 2000) {
dataSource.Take = 2000;
var json = JsonConvert.SerializeObject(dataSource);
//replace request stream to downstream handlers
var requestContent = new StringContent(json, Encoding.UTF8, "application/json");
stream = await requestContent.ReadAsStreamAsync();//modified stream
notModified = false;
}
} catch {
//No-op or log error
}
if (notModified) {
//put original data back for the downstream to read
var requestData = Encoding.UTF8.GetBytes(originalContent);
stream = new MemoryStream(requestData);
}
request.Body = stream;
}
await _next.Invoke(context);
}