Web Service 小练习

对于网站与网站之间数据互动,这是我的说法,不是专家说的,不要相信。应该有专业的说法。

从他人的网站通过一个接口获取数据,这一直是我感到神奇的事,怎么实现的,一直萦绕于心,想要弄过究竟,怎么是实现的啊!不止一次在群里听到同样的提问。可惜每次我都没有深入探究,自己太懒惰了,不想动手实践,想找现成的,可惜也没有去找。

还是要工作压力驱使,不然也许这个一直对我来说是一个疑惑。工作中有这么一个任务就是通过接口去获取供应商的数据,还好已经有现成的了,我只要看懂,然后模仿做一个就可以了,不过也费了我不少时间。发现有两种方式:一是通过xml,二是通过web service。我做的是用xml实现,而另外一种当时就没有深入去探究了。但是在我心里一直是一个结,我要试一试,实现它。于是有了今天的结果。一个小小实验。

我是用asp.net 4.0实验的 两个项目,模拟两个网站。其实也包含了几个知识点:web Service,数据压缩,流数据等,dataset 与流的互转化。

web Service 端代码,从数据库中获取数据,然后使用了压缩,流传递数据

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Web.Services;
  6 using System.Data;
  7 using System.Data.SqlClient;
  8 using System.Text;
  9 using System.IO;
 10 using System.Runtime.Serialization.Formatters.Binary;
 11 using System.Runtime.Serialization;
 12 using System.IO.Compression;
 13
 14
 15 namespace WebSiteTest
 16 {
 17     /// <summary>
 18     /// WebServiceSend 的摘要说明
 19     /// </summary>
 20     [WebService(Namespace = "http://tempuri.org/")]
 21     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 22     [System.ComponentModel.ToolboxItem(false)]
 23     // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
 24     // [System.Web.Script.Services.ScriptService]
 25     public class WebServiceSend : System.Web.Services.WebService
 26     {
 27
 28         [WebMethod]
 29         public string HelloWorld()
 30         {
 31             return "Hello World";
 32         }
 33
 34         [WebMethod]
 35         public int add( int a, int b)
 36         {
 37             return a + b;
 38         }
 39
 40         //用流发送数据
 41         [WebMethod]
 42         public byte[] getdata(int id)
 43         {
 44             byte[] bArrayResult = null;
 45             string sqlstr = "select * from   BlogArticle where BlogId>" + id;
 46             DataSet ds=new DataSet();
 47             using (SqlConnection conn = new SqlConnection(connstr))
 48             {
 49                 conn.Open();
 50                 using (SqlCommand cmd = new SqlCommand())
 51                 {
 52                     cmd.CommandText = sqlstr;
 53                     cmd.CommandType = CommandType.Text;
 54                     cmd.Connection = conn;
 55                     SqlDataAdapter dap = new SqlDataAdapter(cmd);
 56                     dap.Fill(ds);
 57                     ds.RemotingFormat = SerializationFormat.Binary;
 58                     MemoryStream ms = new MemoryStream();
 59                     IFormatter bf = new BinaryFormatter();
 60                     bf.Serialize(ms, ds);
 61                     bArrayResult = ms.ToArray();
 62                     ms.Close();
 63                     return Compress(bArrayResult);
 64                     //return dt.Rows[0]["BlogTitle"].ToString();
 65                 }
 66             }
 67
 68         }
 69
 70         //[WebMethod]
 71         //public byte[] getgzipdata(int id)
 72         //{
 73         //    byte[] bArrayResult = null;
 74         //    string sqlstr = "select * from   BlogArticle where BlogId>" + id;
 75         //    DataSet ds = new DataSet();
 76         //    using (SqlConnection conn = new SqlConnection(connstr))
 77         //    {
 78         //        conn.Open();
 79         //        using (SqlCommand cmd = new SqlCommand())
 80         //        {
 81         //            cmd.CommandText = sqlstr;
 82         //            cmd.CommandType = CommandType.Text;
 83         //            cmd.Connection = conn;
 84         //            SqlDataAdapter dap = new SqlDataAdapter(cmd);
 85         //            dap.Fill(ds);
 86         //            ds.RemotingFormat = SerializationFormat.Binary;
 87
 88         //            MemoryStream ms = new MemoryStream();
 89         //            IFormatter bf = new BinaryFormatter();
 90         //            bf.Serialize(ms, ds);
 91         //            bArrayResult = ms.ToArray();
 92         //            ms.Close();
 93         //            return bArrayResult;
 94         //            //return dt.Rows[0]["BlogTitle"].ToString();
 95         //        }
 96         //    }
 97         //}
 98         //压缩流数据
 99         public static byte[] Compress(byte[] bytes)
100         {
101             using (MemoryStream ms = new MemoryStream())
102             {
103                 GZipStream Compress = new GZipStream(ms, CompressionMode.Compress);
104
105                 Compress.Write(bytes, 0, bytes.Length);
106
107                 Compress.Close();
108
109                 return ms.ToArray();
110
111             }
112         }
113         private static string connstr = "Data Source=.;Initial Catalog=mytest;Integrated Security=True";//数据库连接
114
115     }
116 }

压缩前数据大小如图片一

压缩后数据大小如图片二

接收端 代码,需要web引用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO.Compression;

namespace WebReceivetest
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btntest_Click(object sender, EventArgs e)
        {
            MyWebTest.WebServiceSend websend = new MyWebTest.WebServiceSend();
            int first = int.Parse(txtfirst.Text);
            int second = int.Parse(txtsecond.Text);
            int result = websend.add(first, second);
            labresult.Text = result.ToString();
            //string xx=websend.getdata(10);
            //labresult.Text = result.ToString() + "-----------" + xx;
            DataSet ds = BinaryToDataset(websend.getdata(151));
            GridView1.DataSource = ds;
            GridView1.DataBind();

        }
        //流转换为dataset数据
        public DataSet BinaryToDataset(byte[] bUserData)
        {
            if (bUserData == null)
            {
                //MessageBox.Show("二进制数据流为空");
                //err = "";
                return null;
            }
            // 反序列化的过程
            MemoryStream ms = new MemoryStream(Decompress(bUserData));
            IFormatter bf = new BinaryFormatter();
            object obj = bf.Deserialize(ms);
            DataSet dsResult = (DataSet)obj;
            ms.Close();
            return dsResult;
        }

        //解压流数据
        public static byte[] Decompress(Byte[] bytes)
        {
            using (MemoryStream tempMs = new MemoryStream())
            {
                using (MemoryStream ms = new MemoryStream(bytes))
                {
                    GZipStream Decompress = new GZipStream(ms, CompressionMode.Decompress);

                    Decompress.CopyTo(tempMs);

                    Decompress.Close();

                    return tempMs.ToArray();
                }
            }
        }
    }
}

解压前数据大小如图片三

压缩后数据大小如图片四

通过这一次小实验,心中的疑惑完全消除了。实践——求真——消除疑惑。

参考:http://www.cnblogs.com/zhangzheny/archive/2007/06/16/785734.html

http://www.cnblogs.com/amylis_chen/archive/2012/11/06/2757808.html

http://www.cnblogs.com/qugangf/archive/2011/04/11/2012193.html

时间: 2024-10-28 14:56:38

Web Service 小练习的相关文章

关于 XML/EDI Web Service 小介绍

XML/EDI 系统的设计 总体框架 该 XML/EDI 系统分为四个层次: 第一层是提供 Web Service 的服务提供者,它包括服务提供者所能提供的所有服务(主要是与数据库之间的交互以及复杂功能的实现) 第二层是收集 Web Service 的服务代理,它主要收集所有的 Web Service 并对外发布,服务代理可以通过 Internet 或 Intranet 向服务中心发送远程调用信息,这些信息吧请求内容以 XML 数据格式表示且采用基于 HTTP 等通用 Internet 协议之上

使用TcpTrace小工具截获Web Service的SOAP报文

Web Service客户端对服务端进行调用时,请求和响应都使用SOAP报文进行通讯.在开发和测试时,常常查看SOAP报文的内容,以便进行分析和调试.TcpTrace是一款比较小巧的工具,可以让我们截获TCP/IP协议上的报文,因为HTTP.JMS.STMP等协议都构建在TCP/IP基础上,所以可以很容易地截获Web Service的SOAP请求和响应报文.    我们实例中的Web Service运行于8080端口,可以让TcpTrace在8088端口上监听,并将8088端口监听的报文转发到8

Web Service测试工具小汇

最近一直在做WebService的测试,考虑到手工测试的困难,所以特意去寻找好的测试工具,现在做一个整理. 1..NET WebService Studio 这款工具出自微软内部,最大的优点是可视化很好,不用去看那些XML文件,WebService的基础内容就有XML,但是测试中Case过多,每次测试结果都去看XML文件,看一轮下来对个人的视力是个很大的损害. 从上图可以看到,操作上也很方便,只需要把Service部署到IIS后,在WSDL EndPoint中输入这个要测的Service的URL

Maven+jersey快速构建RESTful Web service集成mongodb-短小而精悍-值得拥有

源码下载地址:http://pan.baidu.com/s/1gdIN4fp 转载请注明原著地址:http://blog.csdn.net/tianyijavaoracle/article/details/41708217 Jersey是JAX-RS(JSR311)开源参考实现用于构建RESTful Web service.此外Jersey还提供一些额外的API和扩展机制,所以开发人员能够按照自己的需要对Jersey进行扩展 理论的东西在这里我就不多说了!这个实例是实现了REST的三个基本get

Axis2实现 web service接口开发 + 客户端调用

一. 新建一个web项目, 1.打开axis2.war包,将conf,lib,modules三个文件夹复制到项目的WEB-INF文件夹下,再在WEB-INF目录下新建一个services文件夹,然后在services文件下新建一个文件夹(任意取名): 再新建META-INF文件夹,最后再新增services.xml,接口信息就写在这里面. 具体路径:WEB-INF/services/myservice/META-INF/services.xml 2.配置 web.xml .加载axis2 和 a

zzWCF实现RESTFul Web Service

http://www.cnblogs.com/KeithWang/archive/2012/02/14/2351826.html http://blog.csdn.net/qq_26054303/article/details/48655985 http://www.cnblogs.com/LNCLSH/p/3781572.html 共同学习了前面一些概念,终于开始正题了哈.RESTful的Web Service调用直观,返回的内容容易解析.这里先会描述一个简单的场景--Web Service提

Web Service简介

1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册. XML:(Extensible Markup Language)扩展型可标记语言.面向短期的临时数据处理.面向万维网络,是Soap的基础. Soap:(Simple Object A

Web Service学习之六:CXF解决无法处理的数据类型

CXF不能够处理像Map复杂的数据类型,需要单独转换处理. 总体思路:创建一个转换器和一个对应的可以处理的数据结构类型,将不能处理的类型转换成可以处理的类型: 步骤: 一.创建一个可以处理的类型 举例:要转换Map<String,User> package ws; import java.util.List; public class StringUser { public static class Entry { private String key; private User value;

.NET基础拾遗(7)Web Service的开发与应用基础

Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 (7)WebService的开发与应用基础 一.SOAP和Web Service的基本概念 Web Service基于SOAP协议,而SOAP本身符合XML语法规范.虽然.NET为Web Service提供了强大的支持,但了解其基本机制对于程序员来说仍然是必需的. 1.1 神马是SOAP协议?