新一个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("随便写了 反正你会改的!");
}

代码github地址

Net Core 中间件实现修改Action的接收参数及返回值的更多相关文章

  1. Action属性接收参数

    一.action的属性(地址栏传参)接收参数:如果使用的JDK属性不一致,则会使得传值无法实现.解决办法:1.系统自身需要用到的JDK(window——>属性——>Java——>In ...

  2. .net 接收存储过程的返回值 。。。。

    .net 接收存储过程的返回值 .... Posted on 2009-06-10 20:26 且行且思 阅读(...) 评论(...) 编辑 收藏 例如在向数据库添加新数据时,需要检测是否有重复 本 ...

  3. Struts2(四)Action一接收参数

    一.属性接收参数并输出 导入struts2的包,导入需要的包 和struts.xml配置文件 <?xml version="1.0" encoding="UTF-8 ...

  4. VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试

    [提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...

  5. ASP.NET Core搭建多层网站架构【11-WebApi统一处理返回值、异常】

    2020/02/01, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[11-WebApi统一处理返回值.异常] 使用I ...

  6. JDBC和JPA调用储存过程 接收存储过程有返回值

    ============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...

  7. Spring Boot之 Controller 接收参数和返回数据总结(包括上传、下载文件)

            一.接收参数(postman发送) 1.form表单 @RequestParam("name") String name 会把传递过来的Form表单中的name对应 ...

  8. Spring Aop 修改目标方法参数和返回值

    一.新建注解 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Document ...

  9. 【转】MVC form提交实体接收参数时空字符串值变成null

    问题:entity.BZ的值是null,Request.Form["BZ"]的值是空字符串 目标:让entity.BZ的值是空字符串. 解决方法:在实体的BZ属性上加上 [Disp ...

随机推荐

  1. DevExpress的TcxDBLookupComboBox使用方法及问题

    使用TcxDBLookupComboBox需要设置以下属性: 1.DataBinding.DataSource:数据感知控件的数据源. 2.DataBinding.DataField:数据感知控件的连 ...

  2. Xcode一些好用的插件,以及这些插件的管理器

    最近从xcode6.4升级到xcode7,发现以前所有的插件都失效了,如果要安装,需要重新去一个个下载.安装,很麻烦. 于是,转来了这篇博文,亲自测试,发现很好用...... 地址:http://11 ...

  3. Windows10卡顿,磁盘 内存占用100%或比较多

    1.关闭服务:Superfetch: 2.结束antimalware service executable进程,gpedit.msc下依次点击“计算机配置/管理模板/Windows组件/Windows ...

  4. js获取select标签选中的值及文本

    原生js方式: var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = obj.selectedIndex; // ...

  5. dev gridview自动列宽和单元、行、checkbox选中和多选

    #region 自动列宽 for (int I = 0; I < gridView1.Columns.Count; I++) { this.gridView1.BestFitColumns(); ...

  6. .NET MVC 学习笔记(五)— Data Validation

    .NET MVC 学习笔记(五)—— Data Validation 在实际应用中,我们需要对数据进行增查改删业务,在添加和修改过程中,无论你编写什么样的网页程序,都需要对用户的数据进行验证,以确数据 ...

  7. Lily-一个埋点管理工具

    本文来自网易云社区 前言 在很多项目中,埋点数据使用表格来统计的,随着项目的进行,数据量越来越复杂,越来越难以维护.所以很多公司都已经开发了一整套系统,从埋点的录入到代码的输出. 我们项目中iOS和A ...

  8. Loop List

    Loop List is very common in interview. This article we give a more strict short statement about its ...

  9. Class和普通js构造函数的区别

    Class 在语法上更加贴合面向对象的写法 Class 实现继承更加易读.易理解 更易于写 java 等后端语言的使用 本质还是语法糖,使用 prototype Class语法 typeof Math ...

  10. Dubbo原理实现之与spring融合

    Spring中bean的定义可以通过编程,可以定义在properties文件,也可以定义在通过xml文件中,用的最多的是通过xml形式,由于xml格式具有很好的自说明便于编写及维护.对于xml的文档结 ...