首页新闻找找看学习计划

webapi模型绑定

0
悬赏园豆:20 [已关闭问题] 关闭于 2015-09-24 11:52

最近在使用webapi的时候,因为是外部调用所以是用httprequest发出post请求,在作类似新增功能的时候,忽然想直接将新增对象打流为二进制post(以前都是用键值对传递然后再打流),于是就将对象序列化发送,问题来了:

1在webapi端接收,发现对象为null,显然绑定映射失败,

2在ActionFilterAttribute处监控后,发现Request.Content.ReadAsStreamAsync().Result中的流是过来了,在换成字符串后发现数据也过来了,但是字符串开始的地方有几个乱码,诡异的是字符串中其它地方无任何乱码,再发送端打流处发现是字节码为255(不知道0-255中有何不同)

3 想到是否是因为webapi的json格式导致无法处理于是就去掉json格式,然后发现webapi端的接收处即post方法处的模型不再为null,而是一个属性全部为默认值的对象(格式改为json前一直为null),我思考是否模型已经能够映射,但是为何属性值的数据都没过来呢?

请各路英雄指点,亦或有其它方案解决。

老三的古代的主页 老三的古代 | 初学一级 | 园豆:184
提问于:2015-09-22 12:24
< >
分享
所有回答(3)
0

1.自定义媒体序列化和绑定

吴瑞祥 | 园豆:28731 (高人七级) | 2015-09-22 12:34

  英雄所说乃是最后一招,无它法惟有此计了。

支持(0) 反对(0) 老三的古代 | 园豆:184 (初学一级) | 2015-09-22 12:51
0

方法1:可以直接将客户端数据转换成二进制数据,API直接接受

方法2:二进制流(可带参数),API以流的形式接受

方法1比较简单,也直观

方法2

可以用

MultipartFormDataContent  这个类 做单元测试发送数据

解析伪代码

string root = HttpContext.Current.Server.MapPath("~/App_Data"); //指定要将文件存入的服务器物理位置             var provider = new MultipartFormDataStreamProvider(root);             // Read the form data.             await Request.Content.ReadAsMultipartAsync(provider);

高大上的名字 | 园豆:202 (菜鸟二级) | 2015-09-22 13:29

  目前是采用将对象直接打成二进制流的方法,但是api只能接受到结构不能获取数据,能否详细指出。

目前方式:

客户端                                                          服务端(webapi)

post( obj的二进制流  )                                     public void post([frombody] object obj)

目前采用客户端将一个对象序列化打成二进制流然后post到webapi端,但是服务端的obj不为空但是只是一个属性无值得对象,即无数据。

支持(0) 反对(0) 老三的古代 | 园豆:184 (初学一级) | 2015-09-22 13:41
0

目前对于直接post对象无法绑定,暂且认为是webapi的默认只支持json和xml,关于为何能够映射出结构却无数据暂无解释。目前采用json,园中有一仁兄的文章能够帮助你解决webapi的很多问题,若他人有疑惑可自寻解决。http://www.cnblogs.com/aehyok/p/3460164.html

老三的古代 | 园豆:184 (初学一级) | 2015-09-24 11:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册