WebApi传参总动员(填坑)
本以为系列文章已经Over,突然记起来前面留了个大坑还没填,真是自己给自己挖坑。
这个坑就是:
(body 只能被读取一次)Only one thing can read the body
MVC和WebAPI之间的一个关键不同点在于MVC缓存请求主体(request body)。这意味着MVC的参数绑定可以反复从body中查找参数片断。然而,在WebAPI中,请求主体(HttpContent) 只能被读取一次,不被缓存,只能向前读取的流。这意味着parameter binding需要谨慎对待stream,除非在需要绑定参数的情况下,否则stream不能被读取。 以下的action方法想直接读取stream,因而导致WebAPI不能保证其拥有用于参数绑定的stream。
引自:
[译]WebAPI下的如何实现参数绑定
这也就意味着,凡是参数中含有实体类型的,这个实体只能获取一次。
话说园子里WebApi安全性的文章也不少了,可是这个坑少有人提,也不晓得为啥,只好自己走一个大弯路先。
本人所在公司目前用MVC开发,Api做安全验证的时候,是将验证的系统参数和数据一起打包成一个匿名类,在Attribute中做验证,是可行的。同样的方式,拿到WebApi中,就死活走不下去。因为在ActionFilterAttribute中用请求的输入流(貌似只能以此种办法)获取实体后,在Action中就拿不到真正的数据了。
经过调整后的验证代码:
/// WebAPI防篡改签名验证抽象基类Attribute /// </summary>
public override void OnActionExecuting(HttpActionContext actionContext)
{ //获取Asp.Net对应的Request var request = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request; NameValueCollection getCollection = request.QueryString;//此签名要求client_id、token及timestamp均通过QueryString传递
string outMessage = "未经过验证的请求!";
if (getCollection != null && getCollection.Count > )
{ string client_id = getCollection["client_id"];
string timestamp = getCollection["timestamp"];
string token = getCollection["token"];
if (!string.IsNullOrWhiteSpace(client_id)//必须包含client_id
&& !string.IsNullOrWhiteSpace(timestamp)//必须包换时间戳 && !string.IsNullOrWhiteSpace(token))
//&& Regex.IsMatch(client_key, "^[0-9A-Za-z]{32}$"))//sign必须为32位Md5摘要
{
Config.Service.SignCalculation sc = new Config.Service.SignCalculation();
if (sc.VerifyClientParam(client_id, token, timestamp, out outMessage))
{//验证通过,执行基类方法
base.OnActionExecuting(actionContext);
return;
}
}
var html = "<p>" + outMessage + "</p>"; //此处暂时以401返回,可调整为其它返回
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized,"验证失败");
actionContext.Response.Content = new StringContent(html, Encoding.UTF8, "text/html");
}
}
调整后,验证参数从请求QueryString中获得,Action可以用本系列的几种办法均可以顺利获取实际的数据。
填坑完毕。
本系列为本人原创,解决了本人实际工作中碰到的问题。
写文章不易,欢迎转载。但转载的时候,带上原文链接,可好?
WebApi传参总动员(填坑)的更多相关文章
- WebApi传参总动员(一)
目前自己的工作和WebApi相关,免不了传入.接收参数.以前的老办法是从请求流中获取json,再反序列化,这中间有2个不能控制的地方,一个是流,一个是反序列化,都需要try,总感觉非常的不爽.因此对W ...
- WebApi传参总动员(四)
前文介绍了Form Data 形式传参,本文介绍json传参. WebApi及Model: public class ValuesController : ApiController { [HttpP ...
- WebApi传参总动员(五)
上回说到涉及多个实体的传参,用常规的方法已经不能解决了.这回我们用终极大招搞定她. WebApi:注意要引用JSON.Net [HttpPost] public string GetData(stri ...
- WebApi传参总动员(三)
上篇介绍了如何从输入流中获取实体对象.本篇介绍以url形式传递参数.简单的参数不再赘述,这里主要实现形如(string name,Woman woman)这样的参数传递. 本篇及后面几章均涉及js调用 ...
- WebApi传参总动员(二)
上篇,从最简单的string入手.本篇演示了从请求的输入流中获取实体.api: public class ValuesController : ApiController { [HttpPost] p ...
- C# WebApi传参之Post请求-AJAX
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷. 学无止境,精益求精 上一节讲述了C# WebApi传参之Get请求 ...
- C# WebApi传参之Get请求-AJAX
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷. 学无止境,精益求精 在介绍本篇博客之前,先来温故下AJax的请求, ...
- WebAPI传参
1.GET请求传递参数 URL传参:http://localhost/ApiTest/test?id=1 API接收参数 [HttpGet] public string GetUser(int id) ...
- C#进阶系列——WebApi 传参详解
本篇打算通过get.post.put.delete四种请求方式分别谈谈基础类型(包括int/string/datetime等).实体.数组等类型的参数如何传递. 回到顶部 一.get请求 对于取数据, ...
随机推荐
- 3.C#中泛型类的进一步探讨
阅读目录 一:多重泛型 class不仅可以有T,还可以有K,实例化的时候传多个数据类型的类型,C#集合类型中的Dictionary就是多重泛型 using System; using System. ...
- 本博客停止更新,移至purecpp.org
声明:本博客停止更新,迁移至C++开源社区purecpp.org, 欢迎持续关注!
- jeos没有消亡,但看 debian 的 netinst .iso格式,那就是jeos的系统!
曾经ubuntu推出专供轻量硬件(如虚拟机)方式的just os格式的.iso [小巧.轻量.快速.干净] 但在 ubuntu 8.04后 再也没有继续 ...... 可惜 不曾想,ubuntu的老爸 ...
- 安卓Android面试题大全
56个问题都是经常用到的,可以深入研究下,也是必须掌握的开发必备知识. 安卓Android面试题汇总 搜集了一些Android面试题目,供将要面试或者正在面试的朋友参考. 1, 谈谈你对Activit ...
- 如何让DevExpress TreeList的每个结点高亮显示?
概述:如何让DevExpress TreeList的每个节点高亮显示? 如何让DXperience TreeList的每个节点高亮显示? 效果如下: private void treeList1_Cu ...
- java8 函数式编程
/*** * 测试统计API <br> * 小结:<br> * 1.逻辑代码应用{} 包起来 不写{} 默认 + return <br> * 2.重载方法参数必须加 ...
- java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库
JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...
- Android & CM build basics
[CM source code folders] bootable/Among other things, the source for ClockworkMod recovery is in her ...
- 用Python开始机器学习(7:逻辑回归分类) --好!!
from : http://blog.csdn.net/lsldd/article/details/41551797 在本系列文章中提到过用Python开始机器学习(3:数据拟合与广义线性回归)中提到 ...
- Python单元测试框架之pytest -- 生成测试报告
继续pytest单元测试框架的学习,pytest可以生成多种类型的测试报告.这一节就来学习pytest如何生成测试报告. 创建test_calss.py 测试用例文件,这里以测试该文件为例. #cod ...