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 ...
随机推荐
- http://vjudge.net/contest/view.action?cid=51142#problem/C 精度转换的一道题。。。
C - Get-Together at Den's Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & ...
- uniGUI 通过SessionList操作另外的登录用户
参照bbs,写了这个方法,检查是否有同名用户已经登录:procedure TUniMainModule.CheckSameUser(aUserLoginCode: string);var ASess ...
- centos7 搭建WEB服务器
centos7 搭建WEB服务器 2017年09月17日 09:44:50 逝然1994 阅读数:18321 标签: centosapacheweb服务器 更多 个人分类: centos服务器简单配置 ...
- delphi编写与调用DLL(delphi7下测试通过)
http://blog.sina.com.cn/s/blog_4dbbf76f01000anz.html delphi编写DLL 下面在delphi中编写一个简单的dll,在该dll中只有一个max函 ...
- 设计模式:visitor
拜访者模式(visitor)适用于对复杂结构体进行解析的场景. 所谓复杂结构体,是指包含多个子元素的对象,比如集合,树,图,或者组合对象--.结构体中的每个元素,包括结构体本身实现接口: Elemen ...
- 第一章 在.net mvc生成EF入门
一. 打开Visual Studio 2017(我使用的是2017) 新建一个mvc项目 命名为StudentEntity 二.1)建立完项目后在项目中右击选择新建项,找到ADO.NET实体数据模型 ...
- cad.net的undo返回操作
这是提供给许多从lisp转移到c#的开发人员的一个函数,这个函数利用后绑代码实现undo返回操作. 本代码由edata提供: edata博客 /// <summary> /// 命令动作编 ...
- Java - 阅读与查找
WebSites http://www.importnew.com/ https://www.java-tips.org/ http://www.javaworld.com/ http://www.p ...
- flaks___git
今天呢 我给大家分享一个超实用的一个把代码分享到云端的一种操作 比如我们在家里,要想做项目的话可以直接从云端上拉取下来代码直接开始工作了 而且还可以随时修改,没有地点的局限性了,只要你想敲,随时随地 ...
- 5_Python OOP
1. 实例属性和类属性 (1) 实例属性在构造函数__init__中定义,定义时以self作为前缀,只能通过实例名访问 (2) 类属性在类中方法之外单独定义,还可以在程序中 ...