zoukankan      html  css  js  c++  java
  • ASP.NET 使用Get方式请求WebService,并得到DataSet结果

    注意:如下使用了如下webservices的配置,将导致客户端引用时将无法引用到ArrayOfInt或ArrayOfString参数。

    WebService有多种方式进行请求,如Get,Post,Soap,Documentation等等,注意要使用时在web.config中的system.web节点中增加类似如下的配置节点信息

        <webServices>
          <protocols>
            <add name="HttpGet"/>
            <add name="HttpPost"/>
            <add name="HttpSoap"/>        
            <add name="Documentation"/>
            <add name="HttpPostLocalhost"/>        
          </protocols>
        </webServices>

    在WebService类中实现了如下方法,分别是返回byte[]和XmlDocument对象

           [WebMethod(Description = "返回byte数据")]
            public byte[] GetKeywordQueueToByteArray(string username, string clientId, string seType, string batchTotal, string maxPage)
            {
                DataSet ds = InitData();
                ds.DataSetName = "KeywordQueue";
                byte[] bytes = DataSetToByte(ds);
                //返回前可压缩,节省流量
                return bytes;
            }
    
    
            [WebMethod(Description = "返回XmlDocument")]
            public XmlDocument GetKeywordQueueToXml(string username, string clientId, string seType, int batchTotal, int maxPage)
            {
                XmlDocument xd = new XmlDocument();
                DataSet ds = InitData();
                ds.DataSetName = "KeywordQueue";
                xd.LoadXml(ds.GetXml());
                return xd;
            }
    
            private DataSet InitData()
            {
                DataSet dataset = new DataSet();
                DataTable dtKeyword = new DataTable();
                dtKeyword.TableName = "keywords";
                dtKeyword.Columns.AddRange(new DataColumn[]{
                    new DataColumn() { ColumnName = "keyword", DataType = typeof(System.String) },
                    new DataColumn() { ColumnName = "setype", DataType = typeof(System.String) },
                    new DataColumn() { ColumnName = "maxpage", DataType = typeof(System.Int32) }
                });
                DataTable dtSeType = new DataTable();
                dtSeType.TableName = "se";
                dtSeType.Columns.AddRange(new DataColumn[]{
                    new DataColumn() { ColumnName = "code", DataType = typeof(System.String) },
                    new DataColumn() { ColumnName = "name", DataType = typeof(System.String) },
                    new DataColumn() { ColumnName = "url", DataType = typeof(System.String) }
                });
    
                dtKeyword.Rows.Add("手机", "BD", 1);
                dtKeyword.Rows.Add("网络游戏", "BD", 1);
                dtSeType.Rows.Add("BD", "百度", "");
                dtSeType.Rows.Add("GG", "GG", "");
    
                dataset.Tables.Add(dtKeyword);
                dataset.Tables.Add(dtSeType);
    
                return dataset;
            }
            
            /// <summary>
            /// 把DateSet转化成byte 
            /// </summary>
            /// <param name="m_ds"></param>
            /// <returns></returns>
            public byte[] DataSetToByte(DataSet dataset)
            {
                byte[] result = null;
                MemoryStream memStream = new MemoryStream();
                IFormatter m_formatter = new BinaryFormatter();
                dataset.RemotingFormat = SerializationFormat.Binary;
                MemoryStream ms = new MemoryStream();
                IFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, dataset);
                result = ms.ToArray();
                ms.Close();
                return result;
            }

    请求WebService的测试方法

            public static void Invoke()
            {
                //string webserviceUrl = "http://localhost:9090/KeywordQueueService.asmx/HelloWorld?content=hello world";
                Console.WriteLine("WebService返回XmlDocument,直接解析为DataSet");
                GetDataSetFromWebServiceByXmlDocument();
    
                Console.WriteLine("WebService返回byte[],直接解析为DataSet");
                GetDataSetFromWebServiceByteArray();
            }
    
            /// <summary>
            /// WebService返回的是Byte数组
            /// </summary>
            static void GetDataSetFromWebServiceByteArray()
            {
                string webserviceUrl = "http://localhost:9090/KeywordQueueService.asmx/GetKeywordQueueToByteArray?username=test1&clientId=dkkad8789adda&seType=BD&batchTotal=61&maxPage=1";
                string charSet = "utf-8";
    
                try
                {
                    string pageContent = GetWebServiceContent(webserviceUrl, charSet);
                    Console.WriteLine(pageContent);
                    //加载文档
                    XmlDocument xd = new XmlDocument();
                    xd.LoadXml(pageContent);
                    byte[] bytes = Convert.FromBase64String(xd.DocumentElement.InnerText);
                    //因为WebService方法中序列化过,所以这里需要反序列化
                    MemoryStream ms = new MemoryStream(bytes);
                    System.Runtime.Serialization.IFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                    object obj = bf.Deserialize(ms);
                    DataSet dataset = obj as DataSet;
                    ms.Close();
                }
                catch (Exception err)
                {
                    Console.WriteLine(err.ToString());
                }
            }
    
            /// <summary>
            /// WebService返回的是XmlDocument
            /// </summary>
            static void GetDataSetFromWebServiceByXmlDocument()
            {
                string webserviceUrl = "http://localhost:9090/KeywordQueueService.asmx/GetKeywordQueueToXml?username=test1&clientId=dkkad8789adda&seType=BD&batchTotal=61&maxPage=1";
                string charSet = "utf-8";
    
                try
                {
                    string pageContent = GetWebServiceContent(webserviceUrl, charSet);
                    Console.WriteLine(pageContent);
                    XmlDocument xd = new XmlDocument();
                    xd.LoadXml(pageContent);
                    DataSet ds = new DataSet();
                    ds.ReadXml(new XmlNodeReader(xd));
                }
                catch (Exception err)
                {
                    Console.WriteLine(err.ToString());
                }
            }
    
            /// <summary>
            /// 请求WebService
            /// </summary>
            /// <param name="webserviceUrl"></param>
            /// <param name="charset"></param>
            /// <returns></returns>
            static string GetWebServiceContent(string webserviceUrl, string charset)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webserviceUrl);
                request.Method = "GET";
                request.Timeout = 60000;
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream streamReceive = response.GetResponseStream();
                Encoding encoding = Encoding.Default;
                if (!string.IsNullOrEmpty(charset) && Encoding.GetEncoding(charset) != Encoding.Default)
                {
                    encoding = Encoding.GetEncoding(charset);
                }
    
                StreamReader streamReader = new StreamReader(streamReceive, encoding);
                return streamReader.ReadToEnd();
            }
    
            /// <summary>
            /// 将Byte[]转换为DataSet
            /// <para>反序列化了一下</para>
            /// </summary>
            /// <param name="data"></param>
            /// <returns></returns>
            static DataSet GetDataSetByUnCompressByte(byte[] data)
            {
                MemoryStream ms = new MemoryStream(data);
                System.Runtime.Serialization.IFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                object obj = bf.Deserialize(ms);
                DataSet dsResult = (DataSet)obj;
                ms.Close();
                return dsResult;
            }

     注意,如果数据量极少时,直接返回XmlDocument占用流量更小,如果数据量稍大,则使用压缩的byte[]方式更节省流量!

  • 相关阅读:
    HTML特殊字符编码对照表(备记)
    【java线程】锁机制
    java判断一个字符串是否为空,isEmpty和isBlank的区别
    对Java中properties类的理解
    使用redis的zset实现高效分页查询(附完整代码)
    ServiceStack.Redis高效封装和简易破解
    3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
    2.NetDh框架之简单高效的日志操作类(附源码和示例代码)
    1.NetDh框架之数据库操作层--Dapper简单封装,可支持多库实例、多种数据库类型等(附源码和示例代码)
    SQL Server索引原理解析
  • 原文地址:https://www.cnblogs.com/blackcore/p/2821747.html
Copyright © 2011-2022 走看看