Web 服务

博客也已经开了许久了,今天我就写一下我前端时间对于web服务的理解……(个人理解)

     web服务 ----web Service   我们可以把它看住是MS的一个组件,只不过它是放在internet上进行分布式计算的基本构造块,其实说白了就是对外提供的一个接口,里面的函数可以提供给客户调用!当然web服务的数据传递全部是序列化的数据,典型的就是XML数据.

 

   web服务还有一个最大的优点就是,它可以在不同的平台之间进行数据交互,需要的是他们是基本标准的方式进行数据交互,我们可以将xml  web  service  进行SOAP  在web 上提供的软件服务,使用WSDL文件说明,并且通过UDDI进行注册.

 

     对于web服务有同步和异步的”调用方法“,对于“调用方法”我相信大家都应该明白,意思也就是说,对于提供的外部接口的写法,同步和异步是没什么区别的,只是在调用的时候,对于调用的用户而言,视情况而定。所以我感觉有一定的优越性。至于怎么调用那是你自己的问题,对于提供的接口的人,可以这么理解吧!他是不管的(我不知道我的理解是否有误,单单是我个人的意见,欢迎大家点拨),至于异步的方法主要是代理类提供了BeginInvoke  和EndInvoke的方法来支持异步的处理!

 

     在web服务中也有可能用到事务,“事务”这个概念,我想对于任何一个涉及IT行业的人都应该知道,我个人理解,不管你是用的什么语言,我估计都会用到事务,所谓事务就是一组组合成逻辑工作单元的数据库操作,虽然系统中可能会有出错,但是事务将会控制和维护每一个数据库的完整性和一致性。如果事务在处理的过程中没有出现错误,那么所有的修改将会成为数据库的一部分。如果当中出现任何的错误,数据库将不接受任何的修改。

   

      对于一个使用ASP.NET创建的XML服务,你可以通过设置其应用到一个XML WEB服务上面去,通过webmethod的属性  transtationOption的属性还设置web 服务的事务行为,如果web服务的方法在执行的时候遇到异常的时候,那么该事务就自动结束,如果未出现异常的话,该事务将自动的委托,【webMethod(TransactionOption=TransactionOption.RequiresNew)】,我们就顺便说一 [WebMethod(Description="@@@@@@@@@@@@") ],Description的属性,其实就是提供给外部接口中的方法的描述,可要可不要,一般还是写的好,这样调用的人一看就能明白了。

  关于TransactionOption的属性值,还有几个:  1)Disabled(默认的): 是指XML  web  SERVICES不在事务的处理范围之内,当处理请求的时候,是在没有事务的情况之下去执行相应的方法!  2)NotSupported  : 意思是第一个差不多,就是一样的。  3)Supported : 是指XML  web  SERVICES不在事务的处理范围之内,当请求的时候在没有事务的情况之下创建XML  WEB SERVICES  。   4)Required:XML  web  SERVICES需要事务,由于web服务只能作为根对象参与事务,所以web服务将创建一个新的事务。 5)RequiresNew:XML  web  SERVICES需要新事务。当处理请求的时候  是在新事务内创建XML web  services。

 

    对于web Services   事务的应用,该如何做呢?很简单:大家都知道,对于数据库关联的表,要么全部执行成功,要么全部执行失败,对于这样的情况其实也不是很难实现,但是对于web服务的话,我们就不需要处理一大堆的代码,对于事务而言我们只需要家一句话(TransactionOption=TransactionOption.RequiresNew)】,是在wenmethod里面加上一个属性就ok了,至于其他的操作,你就可以看成是单表操作,无需看成事务,就是这么简单……

     大概就这么多吧!呵呵……其实有些接口只要是数据提供的,有些数据量是非常庞大的,有些数据是很少的,对于很少的数据,我们不需要去做处理,因为处理也是浪费内存,浪费资源,所以对于大数据量的建议你们  可以压缩 序列化   然后再反压缩  反序列化 ,我自己只写了对于dataset的处理的一些方法(这里需要添加MS DataSetSurrogate.dll文件,这个是要从外部引用的,下载地址搜一下就OK了):

 

 

 

  /// <summary>
         /// 返回DataSet对象用Binary序列化后的字节数组
         /// </summary>
         /// <param name="DS"></param>
         /// <returns></returns>
         public static byte[] GetBytes(DataSet DS) {
             BinaryFormatter bf = new BinaryFormatter();
             MemoryStream ms = new MemoryStream();
             byte[] bufffer = null;
             try
             {
                 bf.Serialize(ms, DS);
                 bufffer = ms.ToArray();
             }
             catch
             {

             }
             finally
             {
                 ms.Close();
             }

             return bufffer;
         }
         /// <summary>
         /// 将序列化的数据转换成dataset 对象,但是次数组必须是dataset序列化后的数组
         /// </summary>
         /// <param name="data"></param>
         /// <returns></returns>
         public static DataSet GetDeserializeDataSetByBytes(byte[] data)
         {
             BinaryFormatter bf = new BinaryFormatter();
             MemoryStream ms = new MemoryStream(data);
             DataSet DS = null;
             try
             {
                 DS = bf.Deserialize(ms) as DataSet;
             }
             catch
             {
             }
             finally
             {
                 ms.Close();
             }
             return DS;        
         }
         /// <summary>
         /// 返回DataSetSurrogate对象用Binary序列化后的字节数组(此处引用了微软的开源组件DataSetSurrogate)
         /// </summary>
         /// <param name="DS"></param>
         /// <returns></returns>
         public static byte[] GetBytesByDataSetSurrogate(DataSet DS) {
             DataSetSurrogate DSS = new DataSetSurrogate(DS);
             BinaryFormatter bf = new BinaryFormatter();
             MemoryStream ms = new MemoryStream();
             byte[] buffer = null;
             try
             {
                 bf.Serialize(ms, DSS);
                 buffer = ms.ToArray();

             }
             catch
             {

             }
             finally
             {
                 ms.Close();
             }

             return buffer;
        
         }
         /// <summary>
         ///将序列化后的数组转换成dataset对象,但是次数组字节必须是datasetSurrogate对象转换后的字节数组
         /// </summary>
         /// <param name="data"></param>
         /// <returns></returns>
         public static DataSet GetDeserializeDataSetByDataSetSurrogateBytes(byte[] data)
         {
             BinaryFormatter bf = new BinaryFormatter();
             MemoryStream ms = new MemoryStream(data);
             DataSetSurrogate DSS = null;
             DataSet DS = null;
             try
             {
                 DSS = bf.Deserialize(ms) as DataSetSurrogate;
                 DS = DSS.ConvertToDataSet();
             }
             catch
             {
             }
             finally
             {
                 ms.Close();
             }
             return DS;
         }

         /// <summary>
         /// 返回DataSetSurrogate对象用Binary序列化并ZIP压缩后的字节数组
         /// </summary>
         /// <param name="DS"></param>
         /// <returns></returns>
         public static byte[] GetBytesByDataSetSurrogateZip(DataSet DS)
         {
             byte[] buffer = GetBytesByDataSetSurrogate(DS);
             byte[] buf = getCropess(buffer);
             return buf;
         }
         /// <summary>
         /// 讲数组进行压缩
         /// </summary>
         /// <param name="data"></param>
         /// <returns></returns>
         public  static byte[] getCropess(byte[] data)
         {
             MemoryStream ms = new MemoryStream();
             Stream s = new GZipStream(ms, CompressionMode.Compress,true);
             byte[] buf = null;
             try
             {
                 s.Write(data, 0, data.Length);
                 s.Close();
                 ms.Position = 0;
                 buf = new byte[ms.Length];
                 ms.Read(buf, 0, Convert.ToInt32(ms.Length));
             }
             catch
             {
             }
             finally
             {
                 ms.Close();
             }
             return buf;
         }
         /// <summary>
         /// 将压缩后的数组解压缩
         /// </summary>
         /// <param name="date"></param>
         /// <returns></returns>
         public  static byte[] getDecompress(byte[] date)
         {
             MemoryStream ms = new MemoryStream(date);
             Stream zipStream = null;
             try
             {
                 zipStream = new GZipStream(ms, CompressionMode.Decompress);
                 byte[] buffer = null;
                 buffer = EtractBytesFormStream(zipStream, date.Length);
                 return buffer;
             }
             catch
             {
                 return null;
             }
             finally
             {
                 zipStream.Close();
                 ms.Close();
             }

         }
         /// <summary>
         ///
         /// </summary>
         /// <param name="zipStream"></param>
         /// <param name="dataBlock"></param>
         /// <returns></returns>
         private static byte[] EtractBytesFormStream(Stream zipStream,int  dataBlock)
         {

             try
             {
                 byte[] data = null;
                 int totalBytesRead = 0;
                 while (true)
                 {
                     Array.Resize(ref data, totalBytesRead + dataBlock + 1);
                     int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);
                     if (bytesRead==0)
                     {
                         break;                   
                     }
                     totalBytesRead += bytesRead;
                   
                 }
                 Array.Resize(ref data, totalBytesRead);
                 return data;
             }
             catch
             {
                 return null;
             }
           
         }

 

 

转载于:https://www.cnblogs.com/joly-han/archive/2011/01/20/web_service.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值