Net Core 中间件实现修改Action的接收参数及返回值
新一个WebApi项目(Net Core 2.1)
新建InputOutputAlterMiddleware类,修改命名空间为Microsoft.AspNetCore.Builder(不修改也没关系,套路而已)
public class InputOutputAlterMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
public InputOutputAlterMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
{
_next = next;
_logger = loggerFactory.CreateLogger<InputOutputAlterMiddleware>();
}
public async Task InvokeAsync(HttpContext context)
{
var method = context.Request.Method;
//判断是POST提交过来的
if (method.Equals("POST"))
{
var requestMessage = context.Request.Form["RequestMessage"];
_logger.LogInformation("requestMessage:" + requestMessage);
var alterValue =$"{requestMessage}被我修改啦!";
var dic = new Dictionary<string, StringValues>
{
{ "value", new StringValues(alterValue) }
};
//修改提交过来的值
context.Request.Form = new FormCollection(dic);
using (var ms = new MemoryStream())
{
var orgBodyStream = context.Response.Body;
context.Response.Body = ms;
context.Response.ContentType = "multipart/form-data";
await _next(context);
using (var sr = new StreamReader(ms))
{
ms.Seek(0, SeekOrigin.Begin);
//得到Action的返回值
var responseJsonResult = sr.ReadToEnd();
ms.Seek(0, SeekOrigin.Begin);
//如下代码若不注释则会显示Action的返回值 这里做了注释 则清空Action传过来的值
// await ms.CopyToAsync(orgBodyStream);
var alterResult = $"没事返回值【{responseJsonResult}】被我改过来啦!";
context.Response.Body = orgBodyStream;
//显示修改后的数据
await context.Response.WriteAsync(alterResult, Encoding.UTF8);
}
}
}
else
{
await _next(context);
}
}
}
新建InputOutputAlterMiddlewareExtensions类,修改命名空间Microsoft.AspNetCore.Builder
public static class InputOutputAlterMiddlewareExtensions
{
public static IApplicationBuilder UseInputOutputAlter(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<InputOutputAlterMiddleware>();
}
}
在Startup类Configure方法下 添加app.UseInputOutputAlter();
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseInputOutputAlter();
app.UseMvc();
}
启动程序 用postman测试,注意Values控制器中的Post的FromBody特性修改成FromForm(只可意会,不可言传)
// POST api/values
/// <summary>
/// 把FromBody修改成了FromForm 因为这里测试是用form提交的
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[HttpPost]
public async Task Post([FromForm] string value)
{
await HttpContext.Response.WriteAsync("随便写了 反正你会改的!");
}

Net Core 中间件实现修改Action的接收参数及返回值的更多相关文章
- Action属性接收参数
一.action的属性(地址栏传参)接收参数:如果使用的JDK属性不一致,则会使得传值无法实现.解决办法:1.系统自身需要用到的JDK(window——>属性——>Java——>In ...
- .net 接收存储过程的返回值 。。。。
.net 接收存储过程的返回值 .... Posted on 2009-06-10 20:26 且行且思 阅读(...) 评论(...) 编辑 收藏 例如在向数据库添加新数据时,需要检测是否有重复 本 ...
- Struts2(四)Action一接收参数
一.属性接收参数并输出 导入struts2的包,导入需要的包 和struts.xml配置文件 <?xml version="1.0" encoding="UTF-8 ...
- VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试
[提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...
- ASP.NET Core搭建多层网站架构【11-WebApi统一处理返回值、异常】
2020/02/01, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[11-WebApi统一处理返回值.异常] 使用I ...
- JDBC和JPA调用储存过程 接收存储过程有返回值
============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...
- Spring Boot之 Controller 接收参数和返回数据总结(包括上传、下载文件)
一.接收参数(postman发送) 1.form表单 @RequestParam("name") String name 会把传递过来的Form表单中的name对应 ...
- Spring Aop 修改目标方法参数和返回值
一.新建注解 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Document ...
- 【转】MVC form提交实体接收参数时空字符串值变成null
问题:entity.BZ的值是null,Request.Form["BZ"]的值是空字符串 目标:让entity.BZ的值是空字符串. 解决方法:在实体的BZ属性上加上 [Disp ...
随机推荐
- 使用 ipmitool 实现远程管理Dell 系列服务器
IBM 文档: http://www.ibm.com/developerworks/cn/linux/l-ipmi/index.html ipmi命令收集: http://hi.baidu ...
- fastscript例子一
fastscript例子一 fastscript例子一 unit Unit1; interface usesWinapi.Windows, Winapi.Messages, System.SysU ...
- VARCHAR的最大长度的问题
大家知道,在SQL Server 2000中,VARCHAR的最大长度是8000,如果字符串的长度超过8000,保存在VARCHAR中时就会被截断.如果你需要传入的参数恰好很长,比如是一个xml,很多 ...
- postgresql 主从 patroni
1 安装基础包 1.1 postgres yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_ ...
- MVC+Nhibernate+spring.net(二)
在上一篇文章中我们已经把数据查了出来,现在我们来完善一下:前台使用easyui 首先我们将NHelper类完善一下 public class EmpDal { public IList<Emp& ...
- WCF接口实例介绍
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. WCF整合了原有的windows通讯 ...
- [HNOI2015]开店(树剖+主席树+标记永久化)
听说正解点分树?我不会就对了 此题是 \([LNOI2014]LCA\) 强化版,也是差分一下,转化为区间加区间和 不过权值有大小要求,那么我们按照权值排序,依次加入主席树,询问的时候 \(lower ...
- 27_网络编程-初识socket
一.C/S B/S 架构 1.定义 (1)C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Cl ...
- 在express3里用ejs模版引擎时,如何使其支持'.html'后缀
①express 默认jade模板,改为ejs模板,需执行以下命令: express -e --ejs ②在app.js中,将 app.set('view engine', 'jade'); 替换为 ...
- POJ 2612
#include<iostream> #include<stdio.h> #include<algorithm> #define MAXN 11 using nam ...