.net面试题目汇总(四)
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ddkangfu.blog.51cto.com/311989/64047 |
一、Remoting和WebService
面试的时候有时候会被问到Remoting和Webservice技术的区别:
1. Remoting 是MarshByReference的,可以传变量的引用,直接对服务器对象操作。速度快,适合intranet(企业内部互联网)。
Webservice 是MarshByValue的,必须传对象的值。速度慢,可以过FIREWALL,配置比较简单,适合internet(因特网)。
2. 一般来说,Remoting是和平台相关的,需要客户和服务器都是.NET,但可配置特性比较好,可以自定义协议,可以使用Http或Tcp协议。
Webservice可以做到跨平台通信,但必须采用SOAP协议。
3. soap消息有rpc和文档两种样式。
文档样式的body元素中包含一个或多个元素,可以是任何内容,只要接受者理解就行了。rpc样式的的body元素中包含调用的方法或远程过程的名称,以及代表方法参数的元素。
.net对这两种样式的实现就是Webservice 和Remoting
4.Remoting不仅能传输XML格式的SOAP包(HTTP),还能传输二进制的数据流(TCP)。
Webservice只能传输SOAP包。
5.Remoting可以用于有状态的情况,Webservice是基于Http无状态的。
6.在Windows操作系统中,Webservice是基于.net framework和IIS框架之上的,而Remoting则是不依赖于IIS的,使用者可以开发和部署自己的宿主服务器。
这里还有两个重点:
1.Remoting的SingleTon和SingleCall模式
SingleTon模式:此为有状态模式。如果设置为SingleTon激活方式,则Remoting将为所有客户端建立同一个对象实例。当对象处于活动状态时,SingleTon实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。SingleTon实例将在方法调用中一直维持其状态。举例来说,如果一个远程对象有一个累加方法(i=0;++i),被多个客户端(例如两个)调用。如果设置为SingleTon方式,则第一个客户获得值为1,第二个客户获得值为2,因为他们获得的对象实例是相同的。如果熟悉Asp.Net的状态管理,我们可以认为它是一种Application状态。
SingleCall模式:SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。同上一个例子而言,则访问远程对象的两个客户获得的都是1。我们仍然可以借鉴Asp.Net的状态管理,认为它是一种Session状态。
2.WebService和SOAP支持处理的数据类型
不知道大家有没有遇到这种情况:在调用WebService并给一个方法传递了一个DataRow参数时,运行时会抛出异常: "没法将参数序列化!",如果把DataRow加入到DataSet中,并将DataSet作为参数传递再运行就OK了。 这是因为:XML WebService只能对数据集DataSet对象类型进行XML序列化,不能对DataRow对象类型进行XML序列化造成的错误. 所以了解一下XML WebService支持序列化的基 本数据类型是比较重要的.它支持的数据类型如下:
1).基本数据类型. 标准类型,如:int float bool DateTime string等基本数据类型 2).枚举. 支持枚举Enum定义的类型 3).自定义对象. 可以传递任意基于自定义类或结构创建的对象。 但要注意一点: 它只能传输数据成员(变量和属性). 如果定义了方法,则方法不能进行序列化传输,序列化后只剩下数据成员. 4).DataSet对象 支持DataSet,切记:不支持DataTable和DataRow,DataSet已经是Webservice能够支持的最小的可序列化对象. 5).XmlNode对象 基于XmlNode的对象可以表示XML文档的一部分. 6).数组和集合 可以使用任何被支持的类型的数组和简单集合,包括: DataSet对象/XmlNode对象和自定义对象. 顺便说明一下序列化的概念:
序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记。给个例子:
[Serializable] class MyUser { public string sUserName; public int iAage; public override string ToString() { return string.Format("姓名:{0},年龄:{1}", sUserName, iAage); } }二、XML相关知识
[持续更新中,敬请关注.....] 本文出自 “一叶障目” 博客,请务必保留此出处http://ddkangfu.blog.51cto.com/311989/64047 本文出自 51CTO.COM技术博客 |


[Serializable]
ddkangfu
博客统计信息
热门文章
最新评论
友情链接