webservic接收byte[]请求

今天做小程序时,发现httphelper有提交byte[]的功能,但webservice端接收时一直没有成功,找了很多方法,最终解决,记录下。

 private void button2_Click(object sender, EventArgs e)
        {
            Stopwatch st = new Stopwatch();
            st.Start();
            //生成dateset

            string toDataTableSql = "select id, djbh ,dj_sn ,xgdjbh ,pihao ,pici ,spid from T_ywmxk where zhuangtai='" + ZhuangTai.待上传 + "'";
            DataSet ds = SqlHelper.ExecuteDataSet(CommandType.Text, toDataTableSql);

            byte[] Zipbuffer = DataFormatter.GetBinaryFormatData(ds);

            HttpHelper http = new HttpHelper();
            HttpItem item = new HttpItem()
            {
                URL = @"http://localhost:61839/SaveData.asmx/Adddataset",
                // URL = url,//URL这里都是测试URl   必需项
                Encoding = null,//编码格式(utf-8,gb2312,gbk)
                Method = "post",
                ContentType = "application/x-www-form-urlencoded",//返回类型    可选项有默认值,
                PostDataType = PostDataType.Byte,
                PostdataByte = Zipbuffer
                // Postdata ="data="+ HttpHelper.ByteToString(Zipbuffer)

            };
            //得到新的HTML代码
            HttpResult result = http.GetHtml(item);
            st.Stop();

            string str = st.ElapsedMilliseconds.ToString();
        }

 

webservice端接收:
 [ValidateInput(false)]
        [WebMethod]

        public void Adddataset()
        {


            Stream s = System.Web.HttpContext.Current.Request.InputStream;
            byte[] b = new byte[s.Length];
            s.Read(b, 0, (int)s.Length);

            DataSet dsData = DataFormatter.RetrieveDataSet(b);
            DataTable dt = dsData.Tables[0];
            StringBuilder str = new StringBuilder();
            int counts = 0;

            for (int d = 0; d < dt.Rows.Count; d++)
            {

                T_ywmxk t = new T_ywmxk();
                _db.T_ywmxk.Add(t);
                t.CreateTime = DateTime.Now;
                t.djbh = dt.Rows[d]["djbh"].ToString();
                t.dj_sn = (int)dt.Rows[d]["dj_sn"];
                t.xgdjbh = dt.Rows[d]["xgdjbh"].ToString();
                t.pihao = dt.Rows[d]["pihao"].ToString();
                t.pici = dt.Rows[d]["pici"].ToString();
                t.spid = dt.Rows[d]["spid"].ToString();
                counts++;
            }
            _db.SaveChanges();

            str.Append("总计:" + dt.Rows.Count);

            Context.Response.Write(str.ToString());
           }

实现DataSet与byte[]的互转:

using System.Data;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace JiaRuiDataPost.MyClass
{
    public class DataFormatter
    {
        private DataFormatter() { }
        /// <summary>
        /// Serialize the Data of dataSet to binary format
        /// </summary>
        /// <param name="dsOriginal"></param>
        /// <returns></returns>
        static public byte[] GetBinaryFormatData(DataSet dsOriginal)
        {
            byte[] binaryDataResult = null;
            MemoryStream memStream = new MemoryStream();
            IFormatter brFormatter = new BinaryFormatter();
            dsOriginal.RemotingFormat = SerializationFormat.Binary;

            brFormatter.Serialize(memStream, dsOriginal);
            binaryDataResult = memStream.ToArray();
            memStream.Close();
            memStream.Dispose();
            return binaryDataResult;
        }
        /// <summary>
        /// Retrieve dataSet from data of binary format
        /// </summary>
        /// <param name="binaryData"></param>
        /// <returns></returns>
        static public DataSet RetrieveDataSet(byte[] binaryData)
        {
            DataSet dataSetResult = null;
            MemoryStream memStream = new MemoryStream(binaryData);
            IFormatter brFormatter = new BinaryFormatter();

            object obj = brFormatter.Deserialize(memStream);
            dataSetResult = (DataSet)obj;
            return dataSetResult;
        }
    }
}

 

 

posted @ 2016-10-26 22:55  swocn  阅读(518)  评论(0)    收藏  举报