中间件修改请求body
1、允许请求body被多次读取,需要在startup添加
app.Use(next => context =>
{
context.Request.EnableBuffering();
return next(context);
});
2、添加中间件类
public class RequestImageReplaceMiddleware
{
private readonly RequestDelegate _next;
private readonly FileUploadSetting _fileUploadSetting;
public RequestImageReplaceMiddleware(RequestDelegate next, FileUploadSetting fileUploadSetting)
{
_next = next;
_fileUploadSetting = fileUploadSetting;
}
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Body != null)
{
var syncIOFeature = context.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
StreamReader stream = new StreamReader(context.Request.Body);
context.Request.Body.Seek(0, SeekOrigin.Begin);
string requestBody = stream.ReadToEnd();//同步读取
if (!string.IsNullOrEmpty(requestBody))
{
bool isJson = true;
try
{
JToken.Parse(requestBody);
isJson = true;
}
catch
{
isJson = false;
}
if (isJson)
{
//保存信息时将所有的url域名替换成指定字符串,在返回时候再将指定字符串替换成域名。
byte[] content1 = Encoding.UTF8.GetBytes(requestBody.Replace(_fileUploadSetting.ImageDomain, CommonConst.ImageDomainReplace));
var requestBodyStream = new MemoryStream();//创建一个流
requestBodyStream.Seek(0, SeekOrigin.Begin);//设置从0开始读取
requestBodyStream.Write(content1, 0, content1.Length);//把修改写入流中
context.Request.Body = requestBodyStream;//把修改后的内容赋值给请求body
context.Request.ContentLength = requestBodyStream.Length;
}
}
context.Request.Body.Seek(0, SeekOrigin.Begin);
}
await _next(context);
}
}
3、添加use方法的类
public static class RequestImageReplaceMiddlewareExtensions
{
public static IApplicationBuilder UseRequestImageReplace(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestImageReplaceMiddleware>(Array.Empty<object>());
}
}
4、在startup的Configure添加
app.UseRequestImageReplace();
过滤器修改响应的body
1、添加过滤器类
/// <summary>
/// 图片域名替换过滤器
/// </summary>
public class ResponseImageReplaceFilter : ActionFilterAttribute
{
private readonly FileUploadSetting _fileUploadSetting;
/// <summary>
///
/// </summary>
/// <param name="fileUploadSetting"></param>
public ResponseImageReplaceFilter(FileUploadSetting fileUploadSetting)
{
_fileUploadSetting = fileUploadSetting;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
if (context.Result is ObjectResult objRst)
{
if (objRst.Value == null)
{
return;
}
try
{
context.Result = new ObjectResult(JToken.Parse(JsonConvert.SerializeObject(objRst.Value).Replace(CommonConst.ImageDomainReplace, _fileUploadSetting.ImageDomain)));
}
catch
{
}
}
}
}
2、startup修改
services.AddMvc(a =>
{
a.Filters.Add<ResponseImageReplaceFilter>();
})