Middleware 获取API拦截Request.Boby并修改值(netcore)

qq_32199703 2018-01-15 11:31:10
我添加了一个MIddleware, 可以拦截到Request.Body(是一个json,其中有一个key是 ProjectId), 调用方并不会传ProjectId给我,我想能在server端全局给ProjectId赋值 ,而不是每一个API方法里面都去赋值ProjectId
public class ApiRequestBase
{

public int ProjectId { get; set; }

public long Id { get; set; }

}

public async Task HandleBusiness(HttpContext context)
{
IHeaderDictionary dic = context.Request.Headers;
var originalRequestBody = context.Request.Body;

using (StreamReader reader = new StreamReader(context.Request.Body, Encoding.UTF8))
{

ApiRequestBase apirequest = JsonConvert.DeserializeObject<ApiRequestBase>(reader.ReadToEnd());

apirequest.ProjectId = 99;


}

}
问题是,我添加了这个MIddleware后, 现在所有的API 在[Frombody]收到的参数都是null了,我该如何把修改后的body继续在middleware中往后传,好像只要我添加了using (StreamReader reader = new StreamReader(context.Request.Body, Encoding.UTF8))这个代码,我全部的api 在frombody拿到的都是null ?
...全文
1388 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你需要先获取请求流
  
// 输入流
var inputStream = HttpContext.Current.Request.InputStream;
然后查看inputStream.Position是否为0,如果不为了0表名你已经读取了数据(额......... 你上面确实已经读取了) 这时你只需要将Position重新设置为0,就可以再次读取了

// 重置输入流读取位置
if (inputStream.CanSeek && inputStream.Position > 0)
{
    inputStream.Position = 0;
}
zhj0078 2018-06-11
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
要那么复杂干嘛,你设置个BaseController不就行了,内部包含个属性就是你的ProjectId,然后要用这个id的就直接从基类取
如果不怎么复杂,那你每个Controller都得继承一下BaseController,和core的原理就有些不符了,而且这种方式我估计只适合UseMvc。
zhj0078 2018-06-11
  • 打赏
  • 举报
回复
MIddleware加不进去,只能退而求其次,建立BaseController,把这个类放到公共组件中,让各个项目的Controller继承一下 public override void OnActionExecuting(ActionExecutingContext filterContext) { ((BaseRequest)filterContext.ActionArguments["req"]).Operator = 99; base.OnActionExecuting(filterContext); }
  • 打赏
  • 举报
回复
要那么复杂干嘛,你设置个BaseController不就行了,内部包含个属性就是你的ProjectId,然后要用这个id的就直接从基类取

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧