asp .net core Get raw request.
小弟初来乍到,分享一些工作学习中遇到的问题和解决方式,如有不准确或是有错误的地方,希望不吝赐教,谢过了。 --Dogtwo
背景:
一个代理服务器BK,接收前端A发送的请求,记录log,并转发给另外的服务器B。
请求中有类似这样的模块:
Person:
{
name:abc,
age: 20,
address:
{
home: xxx,
company: yyy
}
}
其中home,company以及address为可选字段,服务器B要求如果为空则不传递该字段。
对于前端A来说,如果客户没有填入某字段则json中将不包含该字段。
例如若不包含home,则前端A的request中内容为:
Person:
{
name:abc,
age: 20,
address:
{
company: yyy
}
}
前文所述,A的请求会经过BK再转发给B,BK使用ASP.NETCORE,读取A发送来的请求方式如下
public Task Test([FromBody] Model model)
框架本身已经封装很好,会将request.body中内容自动转化为model对象。对于可选字段home来说,如果前端未发送,
则model.person.address.home的值为""。若请求中address整体都未发送,则model.address为null.
一般来说,这样的处理不会有什么问题。但这次的坑中,我们需要把model再当作内容转发给B,原来使用的方法为
(RestRequest) request.addJsonBody(model);
此时会使A发送的请求与B接收的请求出现差异!
此时会使A发送的请求与B接收的请求出现差异!
此时会使A发送的请求与B接收的请求出现差异!(重要的事情说三遍)
例如
A发送的:
Person:
{
name:abc,
age: 20
}
B接收的:
Person:
{
name:abc,
age: 20,
address:null
}
对于基本类型,若某字段可选我们可以这样处理
public int? a { get; set; }
对于内嵌的address来说,经由BK处理后无法取消掉address。(或者是我没找到方法,有办法的话请不吝赐教)
解决办法:
既然框架转化的model不能满足要求,第一思路是直接去取原生的request来获取request.body,转发给B.
但此时在方法为取到的request.body中内容居然为""。明明可以通过[FromBody]来获取model,直接取原生内容居然为空,很费解.
网络求助后发现:
ASP NET Core不允许我们仅仅通过方法参数以任何有意义的方式捕获“原始”数据。因此我们需要通过处理Request.Body来获取原始数据,然后反序列化它。
我们可以捕获原始的Request.Body并从原始缓冲区中读取参数。最简而有效的方法是接受不带参数的POST或PUT数据,然后从Request.Body读取原始数据:
例:
[HttpPost("api/blog/jsonstring")]
public async Task Index()
{
var result = string.Empty;
using (var reader = new StreamReader(Request.Body,Encoding.UTF8))
{
result = await reader.ReadToEndAsync();
}
return result;
}
但在该项目中,使用上述代码取得的result仍为空,笔者代码类似于:
[HttpPost("api/blog/jsonstring")]
public async Task Index([FromBody] Model model)
{
var result = string.Empty;
using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
{
result = await reader.ReadToEndAsync();
}
return result;
}
区别在于多了这个[FromBody] Model model,将其去掉之后result可以成功取得对应值。
继续求助网络发现:
ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream —— 不允许 Request.Body.Position=0 ,这就意味着只能读取一次。
解决办法为
引用命名空间 Microsoft.AspNetCore.Http.Internal ,调用方法 Request.EnableRewind() (但尝试时该方法无效,需要进一步研究)
另外,成功取得request.body值以后要用这个方法将其加入到新的request中:
request.AddParameter("application/json", result, ParameterType.RequestBody);
参考:
1. ASP.NET Core Web API获取原始请求内容
2. ASP.NET Core 中读取 Request.Body 的正确姿势
3.Returning only useful fields from the API && Consuming an API that accepts a comma-separated list of fields.
asp .net core Get raw request.的更多相关文章
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...
- ASP.NET Core 中读取 Request.Body 的正确姿势
ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream —— 不允许 Request.Body.Position=0 ,这就意味着只能 ...
- c# – Asp.Net Core MVC中Request.IsAjaxRequest()在哪里?
要了解有关新的令人兴奋的Asp.Net-5框架的更多信息,我正在使用最新发布的Visual Studio 2015 CTP-6来构建一个Web应用程序. 大多数事情看起来真的很有希望,但我似乎找不到R ...
- ASP.NET Core重复读取Request.Body
//HttpContext context.Request.EnableRewind(); //创建缓冲区存放Request.Body的内容,从而允许反复读取Request.Body的Stream u ...
- ASP.NET Core 2.0 中读取 Request.Body 的正确姿势
原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...
- Asp.Net Core 通过中间件防止图片盗链
一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...
- 我的asp.net core目录
推荐 Asp.NETCore轻松学系列阅读指引目录(asp.net core 2.2) 官方文档翻译 http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore- ...
- Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)
一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...
- ASP.NET Core 2 学习笔记(十四)Filters
Filter是延续ASP.NET MVC的产物,同样保留了五种的Filter,分别是Authorization Filter.Resource Filter.Action Filter.Excepti ...
随机推荐
- Donald Knuth
看了<李开复给计算机系大学生的建议>这篇文章,让我对Donald Knuth这个人产生了兴趣,他是何许人也?于是便有下文. 引用:(1)练内功.不要只花功夫学习各种流行的编程语言和工具,以 ...
- jsonp(对,通俗易懂)
jsonp是啥玩意儿呢 ?你猜! 此感叹号意味着以下内容要说正事儿了!!!!! 由于浏览器为了安全限制(他要怎样他说了算,此处不扯远了):只能允许来自同服务器,同域名的同端口号下请求数据(同源),是的 ...
- 我的C#跨平台之旅(二):开发最为简单的REST API
添加NuGet引用:Microsoft.AspNet.WebApi.Owin 在启动类启用WebApi: 添加一个Controller类,代码如下: 运行程序并访问:http://localhost: ...
- Self referencing loop detected for property 错误
EF 序列化返回json时 报错:Self referencing loop detected for property 解决方案:在webapiconfig.cs文件中,增加设置: 1.config ...
- Python基础理论 - 面向对象
一 面向对象基本理论 面向过程:核心是过程,过程就是解决问题的步骤,即先干什么,再干什么 基于面向过程设计程序,就好比在设计一条流水线,是一种机械思维方法 优点:复杂的问题简单化 缺点:可扩展性差(牵 ...
- 大叔学ML第四:线性回归正则化
目录 基本形式 梯度下降法中应用正则化项 正规方程中应用正则化项 小试牛刀 调用类库 扩展 正则:正则是一个汉语词汇,拼音为zhèng zé,基本意思是正其礼仪法则:正规:常规:正宗等.出自<楚 ...
- FF中flash滚轮失效的解决方案
概述 在FF浏览器中有这样一个bug,就是当鼠标hover在flash区域的时候,滚轮会失效.原因是ff浏览器没有把滚轮事件嵌入到flash里面去.如果这个flash很小的话,比如直播的视频,会很容易 ...
- 《http权威指南》读书笔记10
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
- nginx+lua学习
1. nginx+lua学习 1.1. 网关架构 1.2. nginx命令和信号控制 nginx -s stop 快速关闭,不管有没有正在处理的请求 nginx -s quit 优雅关闭方式,推出前完 ...
- mysql怎么限制ip访问
grant all privileges on *.* to 'root'@'ip'identified by '密码'; #授权某个ip的用户可以通过密码访问数据库