最近在使用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),我思考是否模型已经能够映射,但是为何属性值的数据都没过来呢?
请各路英雄指点,亦或有其它方案解决。
1.自定义媒体序列化和绑定
英雄所说乃是最后一招,无它法惟有此计了。
方法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);
目前是采用将对象直接打成二进制流的方法,但是api只能接受到结构不能获取数据,能否详细指出。
目前方式:
客户端 服务端(webapi)
post( obj的二进制流 ) public void post([frombody] object obj)
目前采用客户端将一个对象序列化打成二进制流然后post到webapi端,但是服务端的obj不为空但是只是一个属性无值得对象,即无数据。
目前对于直接post对象无法绑定,暂且认为是webapi的默认只支持json和xml,关于为何能够映射出结构却无数据暂无解释。目前采用json,园中有一仁兄的文章能够帮助你解决webapi的很多问题,若他人有疑惑可自寻解决。http://www.cnblogs.com/aehyok/p/3460164.html