首页> 搜索结果页
".NET C#创建WebService服务简单实例" 检索
共 56 条结果
.NET、C#基础知识
前言:  学习是一个循序渐进的过程,作为一名.Net软件工程师我们需要学习和掌握的东西非常的多,本章主要是记录下前段时间面试中经常遇到的一些基础常识,这里只是大致的概括还有很多需要学习的东西需要不断的学习和积累。访问修饰符:public:公有访问,不受任何限制。private:私有访问,只限于本类成员访问。protected:受保护的,只限于本类和子类访问。internal:内部访问,只限于本项目内访问,其他的不能访问protected internal:内部保护访问,只限于本项目或是子类访问,其他的不能访问  枚举:  是由一组特定常量构成的一组数据结构,是值类型的一种特殊形式,当需要一个由指定常量集合组成的数据类型时,使用枚举类型。枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int,在代码中使用枚举,可以将以前笨拙的代码变得优雅简单,更加直观,方便记忆。    枚举在什么地方适用呢?  一条普遍规则是,任何使用常量的地方,例如目前用 switch 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。WebAPI 和 WebService的区别:  (https://blog.csdn.net/cysong168/article/details/51433986)webapi使用的是http协议,而webservices采用的是soap协议webapi是无状态的,相对于webserives更轻量级。webapi支持get,和post等http请求http soap关系:  http是一个客户端和服务器端请求和应答的标准(TCP)。http协议其目的是为了提供一种发布和接收htttp页面的方法一http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如”HTTP/1.1 200 OK”,和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。soap 协议:它描述了一种在分散或分布式的环境中如何交换信息的轻量级协议。soap在http协议的基础上,一个基于XML的协议。不同:都是底层的通信协议,请求包的格式不同而已,soap包是XML格式,http纯文本格式。WCF和WEB API我该选择哪个? 1、当你想创建一个支持消息、消息队列、双工通信的服务时,你应该选择WCF 2、当你想创建一个服务,可以用更快速的传输通道时,像TCP、Named Pipes或者甚至是UDP(在WCF4.5中),在其他传输通道不可用的时候也可以支持HTTP  3、当你想创建一个基于HTTP的面向资源的服务并且可以使用HTTP的全部特征时(比如URIs、request/response头,缓存,版本控制,多种内容格式),你应该选择Web API   4、当你想让你的服务用于浏览器、手机、iPhone和平板电脑时,你应该选择Web APIhashmap和hashTable的区别:1.hashTable是Dictionary的子类,HashMap是Map接口的一个实现的类2.Hashtable中的方法是同步的,而HashMap中的方法缺省情况为非同步3.HashTabe不允许null值,而hashmap允许有null4.hashtable默认长度是11,增长方式是0ld*2+1,而hashmap则默认是16,而且一定是2的指数如何理解委托和事件?委托相当于c或者c++中的指针,委托能够把方法当做参数传递,并且提高程序的可扩展性。 事件:以一种特殊的委托委托具有如下特点:1.委托相当于c++中的指针,但是他是安全类型2.委托可以把方法当做参数传递3.委托可以定义回调方法4.委托可以链接在一起,例如:可以对多个事件调用多个方法5.方法不需要与委托前面精确匹配UDP连接和tcp连接的异同:  两者都可以实现远程通讯,而主要区别在于tcp需要保持连接,而Udp不需要,由此可以看出udp更高的效率和占用资源更少,但是tcp传输数据更可靠.Net身份验证的方式有哪几种:  默认值为 Windows。 在Web.config 文件中,通过 <authentication> 节可以配置 ASP.NET 使用的安全身份验证模式,以标识传入的用户。 <authentication mode="[Windows|Forms|Passport|None]"><forms>...</forms><passport/></authentication><authentication> 节的mode 为必选的属性。指定应用程序的默认身份验证模式。此属性可以为下列值之一: Windows :将 Windows 验证指定为默认的身份验证模式。将它与以下任意形式的 Microsoft Internet 信息服务 (IIS) 身份验证结合起来使用:基本、摘要、集成 Windows 身份验证 (NTLM/Kerberos) 或证书。在这种情况下,您的应用程序将身份验证责任委托给基础 IIS。 Forms :将 ASP.NET 基于窗体的身份验证指定为默认身份验证模式。Passport :将 Microsoft Passport Network 身份验证指定为默认身份验证模式。 None :不指定任何身份验证。您的应用程序仅期待匿名用户,否则它将提供自己的身份验证。在c#中object类:1、类Object是 .NET Framework 中所有类、结构、枚举和委托的最终基类。2、C#通常不要求类显示声明从 Object 的继承,因为继承是隐式的。3、因为 .NET Framework 中的所有类均从 Object 派生,所以 Object 类中定义的每个方法可用于系统中的所有对象。 派生类也可以重写这些方法中的某些。高内聚,低耦合的理解:内聚:是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系;耦合:是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。C#面向对象思想主要包括:封装,继承,多态:封装:用抽象的数据类型将数据类型和基本的方法操作封装在一起,在数据保护在抽象类型内部 (封装就是把数据或者函数集合在一个个的类中,封装的对象被称为抽象对象,封装的意义是防止或保护代码被我们无意的破坏,提高代码的重用性,职责分配)继承:子类拥有父类的所有数据和操作多态:一个程序中同名的不同方法的共存情况(方法重载和重写) C#面向切面编程(AOP):  这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程(https://www.cnblogs.com/landeanfen/p/4782370.html)一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。重载和重写的区别:重载:方法名相同参数个数和参数类型不同重写:当子类继承父类,子类中的方法与父类中的方法名,参数类型和参数个数完全相同则称为子类重写了父类方法(需要一override字标示)(对基类成员的  重写)概述反射和序列化:    反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性    (就如:实例化对应的类,然后通过实例字段获取对应的方法)序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。C#中的构造函数:   每次创建类或结构,将会调用其构造函数。类或结构中可以创建多个不个不同参数的构造函数,程序员可以对不同构造函数设置默认值,约束条件,并编写灵活易读的代码。构造函数的特点:      a:构造函数与类名相同 b:构造函数没有返回值 c:可以带参数,也可以不带参数   d:每个类中必须要有都应一个构造函数,一般假如不需要经常用到的话可以不需要声明构造函数,因为程序在编译的时候会自己调用无参的构造函数。 类成员有多少种访问方式:a:实例成员,可以通过类的实例访问b:静态成员可以直接通过类访问简单描述 string str=null;string str="",请尽量用文字说明区别(要点:说明详细的内存空间分配)前者声明变量不会分配内存空间;后者创建了一个空的字符类型,并且分配了对应的内存空间String str=new String("加油");创建了几个string object?创建了两个,一个对象是加油 一个是指向"加油"的strString 类是否可以被继承:不能,因为String类是selead类简单描述.NET里class和struct(结构)异同: 类和结构有很多相似之处:结构可以实现接口,并且具有于类相同的成员类型不同:结构是值类型而非引用类型,结构不能继承,结构存储在堆栈或者内联上。值类型:整数,浮点数,高精度浮点数,布尔,字符,结构,枚举 引用类型:对象(Object),字符串,类,接口,委托,数组sealed(又称密封类)修饰的类有哪些特点:       sealed修饰的类防止此类被派生出其他的类,如果密封类被指定为其它的基类则编译出错(密封类同时不能为抽象类)C#.NET里面抽象类和接口有什么区别?  声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。接 口:(1) 接口不能被实例化   (2) 接口只能包含方法声明   (3) 接口的成员包括方法、属性、索引器、事件   (4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。(5) 接口中的所有成员默认为public,因此接口中不能有private修饰符   (6) 派生类必须实现接口的所有成员   (7) 一个类可以直接实现多个接口,接口之间用逗号隔开   (8) 一个接口可以有多个父接口,实现该接口的类必须实现所有父接口中的所有成员 抽象类和接口 :  相同点和不同点(http://www.cnblogs.com/ronli/archive/2011/10/26/2224654.html)相同点: 1. 都不能被直接实例化,都可以通过继承实现其抽象方法。         2. 都是面向抽象编程的技术基础,实现了诸多的设计模式。不同点:1. 接口支持多继承;抽象类不能实现多继承。2. 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。3. 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。4. 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。5. 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含实现的方法.net中dataset和datareader的区别:  首先,datareader是在线对象,用来以只读只进方式读取数据。只读,就是只能通过它获取数据而不能修改数据,只进,就是读取记录的游标只会不断前进,比如说读取了第5条记录以后就不能返回去读取第2条记录而dataset是离线对象,它就好像是一个数据库,也可以说是数据库的一个副本,你可以对dataset进行离线编辑修改,之后提交回数据库,实现数据的离线操作sql语句中int转varchar:2011-02-12 10:39SELECT parent_id_list+','+cast(id AS varchar(10)) FROM mytable或者cast也可以用convert来代替同时看到有网友有这样的需求,它想把1转成varchar的”000001″这样的串,但是cast函数是只会转成”1″,所以要借用right函数select right(’00000000′ CAST(@i as varchar) 1).数据库多表连接查询可以分为哪几种?并且各有什么作用?主要分为五种: a:主键条件关联查询(表中至少有一个匹配与inner join...on 相似)              b:inner join ...on内连接查询(表中有至少一个匹配,则返回匹配的行)              c:left join....on 左连接查询(右边表没有匹配,也从左边表返回所有的行)               d:right join...on 右连接查询(左边表没有匹配,也从右边表返回所有行)              e:full join...on 全连接查询(就是返回两个表中的所有行)数据库中的存储过程和sql语句有优缺点:      数据库存储过程优点:a:代码精简一致,代码重用性强,可以实现模块化程序设计 b:运行速度快,提高程序的性能, 因为存储程序只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,  所以使用存储过程可提高数据库执行速度       c:可维护性高,只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次。存储过程可独立于程序源代码而单独修改,而不需要      更 改 ,测试以及重新部署程序集。d: 有安全机制,可授予没有直接执行存储过程中语句的权限的用户,也可执行该存储过程的权限。另外可以防止用户直接访问表,强制用户使用存储过程      执行特定的任务。e: 减少网络流量,在网络中要发送的数百行代码,可由一条执行其存储过程代码的一条单独语句就可实现(多条sql语句这里简化成立一个存储过程)         不足:a:架构不清醒不利于面向对象: 存储过程不太适合面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,业务逻辑在存储层实现,增加了业务和存储的耦合,代码的可读性也会降低。b:可移植性差:过多的使用存储过程会降低系统的移植性。在对存储进行相关扩展时,可能会增加一些额外的工作。 T-sql语句:可移植性强,语句灵活查询速度比存储过程要慢数据库存储过程和T-sql语句的选择:在一些新的项目开发过程中一般不推荐优先使用数据库存储过程,一般数据库存储过程适用于一般业务逻辑复杂,涉及到了多表操作,并且查询大批量的数据的时候。例如后台大批量查询,以及定期更新等。 (1)当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时可以考虑应用存储过程 (2)在一个事务的完成需要很复杂的商业逻辑时可以考虑应用存储过程 (3)比较复杂的统计和汇总可以考虑应用后台存储过程数据库常用类型及其含义:注:(Unicode 是「字符集」,UTF-8 是「编码规则」)       Char,NChar 定长,速度快,占空间大,需处理   Varchar,Nvarchar,text 不定长,空间小,速度慢,无需处理Nchar、NVarchar、NTEXT处理Unicode码 char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便但在存储英文时数量上有些损失。 如何使用这些类型: 如果你肯定存储的数据长度,而且不包中文的,可以选择char类型。                   如果肯定存储的数据长度,但可能包括中文,可以选择nchar类型。                   如果不确定存储的数据长度,存储只有英文、数字的最好用varchar                    如果不确定存储的数据长度,也有可能有中文,可以选择nvarchar类型XML和json数据传输格式的优缺点: 什么是 XML?XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种标记语言,很类似 HTMLXML 的设计宗旨是传输数据,而非显示数据XML 标签没有被预定义。您需要自行定义标签。XML 被设计为具有自我描述性。XML 是 W3C 的推荐标准 什么是json?JSON 是纯文本JSON 具有“自我描述性”(人类可读)JSON 具有层级结构(值中存在值)JSON 可通过 JavaScript 进行解析JSON 数据可使用 AJAX 进行传输   区别:xml(可扩展性标记语言)和json两者都是一种跨平台,跨语言的数据传输格式,xml可以自定义标签而json是有规定的文本格式,json                  的适用范围有限而xml没有,但是xml看起来比较复杂,json简单。 XSLT?是一种可扩展的样式表文件,使用xsl可以格式化xml格式,并且能够将xml转化为另一种格式的输出用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答:从下至上分别为:数据访问层、业务逻辑层(又或成为领域层)、表示层 数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关 是表现层与数据访问的的桥梁(起到了逻辑判断)表示层:是系统的UI部分,负责使用者与整个系统的交互。优点:  分工明确,条理清晰,易于调试,而且具有可扩展性缺点:  增加成本。分层式结构究竟其优势何在? 1、开发人员可以只关注整个结构中的其中某一层;2、可以很容易的用新的实现来替换原有层次的实现; 3、可以降低层与层之间的依赖;4、有利于标准化; 5、利于各层逻辑的复用。 概括来说,分层式设计可以达至如下目的:分散关注、松散耦合、逻辑复用、标准定义、易于拓展分层式结构也不可避免具有一些缺陷:  1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。 MVC 编程模式MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:Model(模型)表示应用程序核心(比如数据库记录列表)View(视图)显示数据(数据库记录)Controller(控制器)处理输入(写入数据库记录)MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。 mvc的优点:1.通过把项目分成model view和controller,使得复杂项目更加容易维护。2.没有使用view state和服务器表单控件,可以更方便的控制应用程序的行为3.应用程序通过controller来控制程序请求,可以提供丰富的url重写。4.对单元测试的支持更加出色5.在团队开发模式下表现更出众MVC的不足: (1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 (2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。    (3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 asp.net如何实现MVC模式,举例说明!web/business/dataaccess  列举ASP.NET 页面之间传递值的几种方式1.response. Redirect()   QueryString()...............2.使用Session变量 3.使用Server.Transfer(只能在同一站点中进行url重定向,而且url和url中的参数不会在浏览器中显示)4.application和Cookie请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点QueryString  传递一个或多个安全性要求不高或是结构简单的数值。但是对于传递数组或对象的话,就不能用这个方法了 session(viewstate) 简单,但易丢失 作用于用户个人,过量的存储会导致服务器内存资源的耗尽。application 对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock cookie 简单,但可能不支持,可能被伪造 Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用 input ttype="hidden" 简单,可能被伪造 url参数简单,显示于地址栏,长度有限 Server.Transfer  把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流 数据库稳定,安全,但性能相对弱   什么是Viewstate?它有什么作用?ViewState用来保存页面状态,就是说提交之后我们还可以看到文本框里面的内容就是ViewState保存的功劳。 ViewState只维护当前页面的状态,不同页面之间不能共享,Session可以。 ViewState你可以理解为一个隐藏控件ASP.Net页面生命周期 :(重要)https://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面,  完全识别 HTTP 页面处理程序类后,ASP.NET 运行时将调用处理程序的 ProcessRequest 方法来处理请求,来创建页面对象。通常情况下,无需更改此方法的实现,因为它是由 Page 类提供的。接下来被创建页面对象的ProcessRequest方法使页面经历了各个阶段:初始化、加载视图状态信息和回发数据、加载页面的用户代码以及执行回发服务器端事件。之后,页面进入显示模式:收集更新的视图状态,生成 HTML 代码并随后将代码发送并输出控制台。最后,卸载页面,并认为请求处理完毕。其中页面对象ProcessRequest方法 完成的这一系列事件的处理过程就是Asp.Net页面生命周期。我的理解:首先在对应的浏览器中输入对应的网址对服务器发送请求(request)服务器识别浏览器的http请求,通过调用processrequest方法来处理请求,创建页面对象然后通过创建processrequest方法使页面经历了:初始化,加载试图状态信息,和回发数据,加      载用户代码及执行返回服务器端的事件。之后页面进入显示模式:收集更新的试图状态,生成html代码将代码发送输出在浏览器中展示。最后卸载页面,并认为请求处理完毕每个页面的生命周期为用户的每一次访问,也就是说每一次客户端与服务器之间的一个往返过程.全局变量的生命周期在此之间.1. Page_Init(); 2. Load ViewState and Postback data; 3. Page_Load(); 4. Handle control events; 5. Page_PreRender(); 6. Page_Render(); 7. Unload event; 8. Dispose method called;  ADO.net中常用的对象有哪些?分别描述一下。Connection  数据库连接对象 Command    执行数据库命令DataAdapter  连接数据,执行数据库命令,填充DataSetDataSet  数据在内存中的缓存,数据结构 DataReader    只读向前的读取数据库 DataReader和DataSet的异同 1.与数据库连接:DataReader:面向连接,只读,只进,只能向前读,读完数据就断开连接;(无法对获取的数据进行操作)DataSet:非面向连接,把数据加载到sql缓存池中,然后断开连接;2.处理数据速度:DataReader:速度快;DataSet:速度慢;3.更新数据库:DataReader:更新后,没有办法还原到原来的数据库;DataSet:更新后,可以还原回原来的数据库;4.支持分页排序:DataReader:不支持分页与排序;DataSet:支持分页与排序,从内存中直接读取前多少条(假分页);5.占用内存:DataReader:占用内存小;DataSet:占用内存大;DataSet可以比作一个内存中的数据库,DataTable是一个内存中的数据表,DataSet里可以存储多个DataTable说出你所了解的数据库访问组件(例如ADO,至少4种) 答:ADO,ADO.Net,MDAC(Microsoft Data Access Components),Microsoft SQL Server OLE DB Provider,Microsoft Jet OLE DB Provider,Desktop Database Drivers ODBC Driver,Visual FoxPro ODBC Driver  什么是装箱和拆箱? 答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。装箱(boxing)是将 值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程,而拆箱(unboxing)是将饮用类型数据转换值类型,比如int j = (int)o;属于拆箱接口含义:接口是指一组函数成员而不实现他们的引用类型,通常只能通过接和类的继承,继承接口要实 其全部方法什么时候使用抽象类,什么时候用接口 :接口用于规范,抽象类用于共性。接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。抽象类可以提供某些方法的部分实现,接口不可以.抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。再抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这就是为什么说接口是一个类的规范了)。接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。此外接口不能包含字段、构造函数、析构函数、静态成员或常量。 枚举的使用:https://www.cnblogs.com/claspcn/p/5218520.html委托和事件:(http://www.tracefact.net/tech/009.html)委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。 const和readonly有什么区别? const关键字用来声明编译时常量,readonly用来声明运行时常量。用sealed修饰的类有什么特点 sealed 修饰符用于防止从所修饰的类派生出其它类,如果一个密封类被指定为其他类的基类,则会发生编译时错误。 密封类不能同时为抽象类。 sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。 虚函数的用法 1)virtual指明一成员函数为虚函数,而virtual仅用于类的定义里,在类外可不加此关键字. 2)一个类的成员函数被定义为虚函数时,子类该函数仍保持虚函数特征. 3)子类覆盖此函数时,定义里可不加virtual关键字,但函数声明要和基类的完全一致!且此声明是必须的. 4)不是纯虚函数时,父类的虚函数必须要实现; 而若将父类的虚函数设定为纯虚函数时,子类必需要覆盖之而且必须要实现之! 解释virtual、sealed、override和abstract的区别 virtual申明虚方法的关键字,说明该方法可以被重写 sealed说明该类不可被继承 override重写基类的方法 abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。 c#继承:base表示对象基类的实例(使用base可以调用基类中的成员)base 表示当前对象基类的实例(使用base关键字可以调用基类的成员)this表示当前类的实例  在静态方法中不可以使用base和this关键字  派生类会继承基类所有的成员但是构造函数和析构函数不会被继承   什么是析构函数:析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。注意如果派生类的方法和基类的方法同名则基类中的方法将会被隐藏如果需要隐藏则可以使用关键字new来隐藏如果不写new关键字默认处理为隐藏虽然基类中同名的方法被隐藏了但是还是可以通过base关键字来调用   进程和线程的区别?进程是系统进行资源分配和调度的单位;线程是CPU调度和分配的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。堆和栈的区别: 栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。 概述:栈(Stack)由系统管理生存期,存储代码执行和调用路径,执行或调用完毕即从栈中清除; 堆(Heap)中保存值和对象,调用完毕之后依然存在,由垃圾回收器查找栈中有无指向该值或对象的引用,无则从堆中删除C# ref与out区别:1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。 你对泛型了解吗?简单说明一下泛型的有什么好处?泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用 好处是——类型安全和减少装箱、拆箱。提高性能、类型安全和质量,减少重复性的编程任务 C#中所有对象共同的基类是什么? System.Object. 如何在C#中实现继承? 在类名后加上一个冒号,再加上基类的名称。  私有成员会被继承么? 会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。 (是有成员能够被继承,但是不能够被访问)new的三种用法 答:实例化对象,隐藏基类方法。运算符(创建对象,创建值类型的默认构造函数)修饰作用(隐藏基类中的继承对象,子类中的对象覆盖基类中的版本)string是值类型还是引用类型?引用类型 String类与StringBuilder类有什么区别?为什么在.Net类库中要同时存在这2个类?(简答)stringBuilder比string更节约内存,所以stringBuilder更快String 对象是不可改变的。每次使用 System.String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。而 StringBuilder 则不会。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。 Session有什么重大BUG,微软提出了什么方法加以解决? 答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件 c#中的三元运算符是 ?: .能用foreach遍历访问的对象需要实现(Ienumber) 接口或声明 ( GetEnumerator)方法的类型。.<%# %> 和 <% %> 有什么区别?<%# %>表示绑定的数据源 <% %>是服务器端代码块 C#可否对内存进行直接的操作?在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员 不过在C#中,不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法 DateTime是否可以为null?不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null DateTime.Parse(myString); 这行代码有什么问题?有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse() net的错误处理机制是:采用try->catch->finally结构, 为什么不提倡catch(Exception) try..catch在出现异常的时候影响性能; 应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等 catch(Exception e){throw e;}和catch(Exception e){throw;}的区别将发生的异常对象抛出,另一个只是抛出异常,并没有抛出原异常对象)   我应该如何允许连接池?对于.NET应用程序而言,默认为允许连接池。(这意味着你可以不必为这件事情做任何的事情)当然,如果你可以在SQLConnection对象的连接字符串中加进Pooling=true;确保你的应用程序允许连接池的使用。(pooling=true)5. 我应该如何禁止连接池?ADO.NET默认为允许数据库连接池,如果你希望禁止连接池,可以使用如下的方式:1) 使用SQLConnection对象时,往连接字符串加入如下内容:Pooling=False;2) 使用OLEDBConnection对象时,往连接字符串加入如下内容:OLE DB Services=-4;  提高.NET的性能 1 使用异步方式调用Web服务和远程对象只要有可能就要避免在请求的处理过程中对Web服务和远程对象的同步调用,因为它占用的是的ASP.NET 线程池中的工作线程,这将直接影响Web服务器响应其它请求的能力。2 使用适当的Caching策略来提高性能3 判断字符串,不要用""比较。//避免 if(strABC!=null && strABC!="") {}//推荐 if(!strABC.IsNullOrEmpty) {}4 页面优化5 用完马上关闭数据库连接6 尽量使用存储过程,并优化查询语句 7 只读数据访问用SqlDataReader,不要使用DataSet请解释转发与跳转的区别 转发就是服务端的跳转A页面提交数据到B页面,B页面进行处理然后从服务端跳转到其它页面 跳转就是指客户端的跳转 什么叫应用程序域? 答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。 CTS、CLS、CLR分别作何解释? 答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。 请解释web.config文件中的重要节点appSettings包含自定义应用程序设置system.web 系统配置 compilation动态调试编译设置customErrors自定义错误信息设置 authentication身份验证,此节设置应用程序的身份验证策略 authorization授权, 此节设置应用程序的授权策略.请解释ASP。NET中的web页面与其隐藏类之间的关系? ASP.NET页面一般都对应一个隐藏类,一般都在ASP.NET页面的声明中指定了隐藏类例如一个页面Tst1.aspx的页面声明如下 <%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %> Codebehind="Tst1.aspx.cs" 表明经编译此页面时使用哪一个代码文件 Inherits="T1.Tst1" 表用运行时使用哪一个隐藏类 当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决? 很有可能是在Page_Load中数据处理时没有进行Page的IsPostBack属性判断 请解释什么是上下文对象,在什么情况下要使用上下文对象 上下文对象是指HttpContext类的Current 属性,当我们在一个普通类中要访问内置对象(Response,Request,Session,Server,Appliction等)时就要以使用此对象  解释一下ajax及实现原理 答:Ajax的核心是JavaScript对象XmlHttpRequest,它使您可以使用JavaScript向服务器提出请求并处理响应, 而不阻塞用户,异步请求。​
文章
存储  ·  XML  ·  SQL  ·  开发框架  ·  JSON  ·  前端开发  ·  .NET  ·  数据库  ·  C#  ·  数据格式
2022-09-24
java WebService CXF Spring 自定义拦截器 附实例源码
新建一个接口类</pre><pre name="code" class="java">package com.iflyee.cxf; import javax.jws.WebService; @WebService public interface Ivo { public boolean vo(String username,int count); public int getvousernameCount(); public int getvocount(); public String build01(); public String xml(); } package com.iflyee.cxf; import java.util.ArrayList; import javax.jws.WebService; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; @WebService public class Vo implements Ivo { //添加属性 private static int pt; private static int ut; public int getvocount() { // TODO Auto-generated method stub return pt; } public int getvousernameCount() { // TODO Auto-generated method stub return ut; } public boolean vo(String username, int count) { ut++; pt+=count; return true; } public String build01(){ //DocumentHelper提供了创建Document对象的方法 Document document = DocumentHelper.createDocument(); try { //添加节点信息 Element rootElement = document.addElement("modules"); //这里可以继续添加子节点,也可以指定内容 rootElement.setText("这个是module标签的文本信息"); Element element = rootElement.addElement("module"); for (int i = 0; i < 5; i++) { Element nameElement = element.addElement("name"); Element valueElement = element.addElement("value"); Element descriptionElement = element.addElement("description"); nameElement.setText("名称"+i); nameElement.addAttribute("language", "java"+i);//为节点添加属性值 valueElement.setText("值"+i); valueElement.addAttribute("language", "c#"+i); descriptionElement.setText("描述"+i); descriptionElement.addAttribute("language", "sql server"+i); } System.out.println(document.asXML()); //将document文档对象直接转换成字符串输出 } catch (Exception e) { e.printStackTrace(); } return document.asXML(); } public String xml(){ StringBuffer str = new StringBuffer(); str.append("<body>\n"); APIUtils ap = new APIUtils(); User user = new User(); java.util.List<Object> list = new ArrayList<Object>(); list.add(1); list.add("张胜男"); list.add("xs111"); list.add(2); list.add("张胜"); list.add("xs222"); list.add(3); list.add("胜男"); list.add("xs333"); for (int i = 0; i < 3; i++) { str.append(ap.getXMLModel(user,list)); } System.out.println(str); str.append("</body>"); APIUtils.num=0; return str.toString(); } } package com.iflyee.cxf; public class User { private int id; private String userName; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } package com.lzw.springcxf.auth; import java.util.List; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage>{ public AuthInterceptor() { //拦截器在调用方法之前拦截SOAP消息 super(Phase.PRE_INVOKE); System.out.println("11111111111111111111111111111111111"); } /** * @Description: 拦截器操作 * @param msg 被拦截到的SOAP消息 * @throws Fault */ @Override public void handleMessage(SoapMessage msg) throws Fault { System.out.println("=============================="); System.out.println("=====自定义拦截器======="); //获取SOAP消息的Header List<Header> headers = msg.getHeaders(); //如果没有Header if(headers == null || headers.size() < 1) { throw new Fault(new IllegalArgumentException("没有Header,拦截器实施拦截")); } //获取Header携带是用户和密码信息 Header firstHeader = headers.get(0); Element ele = (Element) firstHeader.getObject(); NodeList userIdEle = ele.getElementsByTagName("userId"); NodeList userPassEle = ele.getElementsByTagName("userPass"); if (userIdEle.getLength() != 1) { throw new Fault(new IllegalArgumentException("用户Id格式不对")); } if (userPassEle.getLength() != 1) { throw new Fault(new IllegalArgumentException("用户密码格式不对")); } //获取元素的文本内容 String userId = userIdEle.item(0).getTextContent(); String userPass = userPassEle.item(0).getTextContent(); if (!userId.equals("lyy") || !userPass.equals("123456")) { throw new Fault(new IllegalArgumentException("用户和密码不正确")); } } } </pre><pre code_snippet_id="1652672" snippet_file_name="blog_20160419_9_4894787" name="code" class="java">package jp.co.service.impl; import jp.co.service.TestService; public class TestServiceImpl implements TestService { <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public String SayHello() { <span style="white-space:pre"> </span>System.out.println("功能方法被调用!"); <span style="white-space:pre"> </span>return "Hello 这是一个简单的WebService实例"; <span style="white-space:pre"> </span>} } 调用方法package com.testClient; import org.apache.cxf.frontend.ClientProxyFactoryBean; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import jp.co.service.TestService; public class TestClient { public static void main(String[] args) { //创建一个客户端的代理工厂 ClientProxyFactoryBean clientProxy = new ClientProxyFactoryBean() ; clientProxy.setServiceClass(TestService.class); clientProxy.setAddress("http://localhost:8080/WcxF/services/test"); TestService pic = (TestService)clientProxy.create(); System.out.println(pic.SayHello()); } } bean.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- 引入CXF的支持的文件,来源CXF的jar文件 --> <import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <!-- 描述相关的晚上服务 --> <jaxws:endpoint id="vo" implementor="com.iflyee.cxf.Vo" address="/vo"> <!-- 配置IN拦截器 --> <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> <bean class="com.lzw.springcxf.auth.AuthInterceptor"></bean> </jaxws:inInterceptors> <!-- 配置OUT拦截器 --> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxws:outInterceptors> </jaxws:endpoint> </beans> cxf-servlet.xml<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:simple="http://cxf.apache.org/simple" xmlns:soap="http://cxf.apache.org/bindings/soap" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd"> <!--配置CXF的ws服务 --> <simple:server id="testservice" serviceClass="jp.co.service.TestService" address="/test"> <simple:serviceBean> <!-- 配置CXF的服务的实现 --> <bean class="jp.co.service.impl.TestServiceImpl"></bean> </simple:serviceBean> </simple:server> </beans> web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!--添加spring的支持--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/bean.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--添加CXF的框架--> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <display-name>WcxF</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app> 源码一:CXF+Spring+自定义拦截器 WebService实例源码下载:http://download.csdn.net/detail/qq_14996421/9495690源码二:根据实体类装换xml源码下载 :        http://download.csdn.net/detail/qq_14996421/9495688
文章
XML  ·  Java  ·  数据格式  ·  Spring
2022-05-10
ASP.NET创建Web服务之设计方针
使用ASP.NET构造一个简单的XMLWeb服务是相对容易的,然而,XMLWeb服务的真正的强大的功能只有等你研究了基础结构以后才能领悟。XMLWeb服务是建立在.NET框架和公共语言运行时间基础上的。一个XMLWeb服务可以利用这些技术。例如,ASP.NET支持的性能、状态管理和验证全都可被用来构造XMLWeb服务。 XMLWeb服务的基础结构是构建来符合象SOAP、XML和WSDL这样的行业标准,并且它允许其他的平台的客户端与XMLWeb服务互操作。只要一个客户端可以发送符合标准的SOAP消息、依据格式化的服务描述,那么这个客户端可以调用一个使用ASP.NET创建的XMLWeb服务(不管客户端存在于何种平台)。 当你使用ASP.NET构造一个XMLWeb服务时,它自动支持客户端使用SOAP、HTTP-GET和HTTP-POST协议通讯。即使HTTP-GET和HTTP-POST支持使用URL编码的变量名/变量值对来传送消息,支持这两个协议的数据类型也没有支持SOAP协议的数据类型丰富。在SOAP中,使用XML把数据传送到XMLWeb服务或从XMLWeb服务取回消息,你可以使用支持丰富的数据类型集的XSD模式定义复杂的数据类型。使用ASP.NET构造一个XMLWeb服务的开发者不必明确地定义复杂的数据类型。他们可以只构造一个管理类。ASP.NET处理定义到一个XSD模式的映射类和到XML数据的映射对象实例,以便通过网络传输。 重要的是要注意XMLWeb服务并不能取代DCOM,我们应该说XMLWeb服务是跨越使用行业标准的平台通信的一种消息传递基础结构。 因为ASP.NET提供了为XMLWeb服务内部工作的基础结构,开发者可以集中精力来实现他们的特定的XMLWeb服务的功能。使用ASP.NET开发一个XMLWeb服务从下面三步开始: 1.创建一个带有.asmx扩展名的文件。 2.在这个文件里面,使用一条指令声明XMLWeb服务。 3.定义组成XMLWeb服务功能的XMLWeb服务方法。 XMLWeb服务是一个强大的技术,用于提供可通过因特网变成访问的服务。下面的建议将帮助你创建高效的XMLWeb服务: XMLWeb服务既支持同步的又支持异步的客户端和存放XMLWeb服务的服务器之间的通信。在同步通信情况下,客户端发送一个对服务的请求到服务主机服务器上等待响应。这防止客户端在等待结果的时候,执行其它的操作。然而异步通信导致客户端在等待相应的时候继续处理其它的任务。客户端在可用的时候响应服务请求的结果。 当你使用Web服务描述语言工具(Wsdl.exe)来创建你的代理类的时候,它产生类中的方法的标准的、同步版本和异步版本。异步版本由两个方法组成,称为Begin和End。Begin方法用于初始化XMLWeb服务,而End方法取得结果。 使用异步通信能够改善系统使用率和避免客户端在它等待XMLWeb服务结果的时候的延迟。 下面的代码示例显示如何从一个客户应用程序产生一个到XMLWeb服务的异步调用。 [C#] <%@PageLanguage="C#"%><%@ImportNamespace="System.Net"%><html><scriptlanguage="C#"runat="server">voidEnterBtn_Click(ObjectSrc,EventArgsE){MyMath.Mathmath=newMyMath.Math();//CalltoAddXMLWebservicemethodasynchronously//andthenwaitforittocomplete.IAsyncResultresult=math.BeginAdd(Convert.ToInt32(Num1.Text),Convert.ToInt32(Num2.Text),null,null);//Waitforasynchronouscalltocomplete.result.AsyncWaitHandle.WaitOne();//CompletetheasynchronouscalltoAddXMLWebservicemethod.floattotal=math.EndAdd(result);//DisplayresultsinaLabelcontrol.Total.Text="Total:"+total.ToString();}</script><body><formaction="MathClient.aspx"runat=server><fontface="Verdana">EnterthetwonumbersyouwanttoaddandthenpresstheTotalbutton.<p>Number1:<asp:textboxid="Num1"runat=server/>+Number2:<asp:textboxid="Num2"runat=server/>=<asp:buttonid="Total_Button"text="Total"OnClick="EnterBtn_Click"runat=server/><p><asp:labelid="Total"runat=server/></font></form></body></html>[VisualBasic]<%@PageLanguage="VB"%><%@ImportNamespace="System.Net"%><html><scriptlanguage="VB"runat="server">SubEnterBtn_Click(SrcAsObject,EAsEventArgs)DimmathAsNewMyMath.Math()'CalltoAddXMLWebservicemethodasynchronously'andthenwaitforittocomplete.DimresultAsIAsyncResult=_math.BeginAdd(Convert.ToInt32(Num1.Text),_Convert.ToInt32(Num2.Text),_Nothing,_Nothing)'Waitforasynchronouscalltocomplete.result.AsyncWaitHandle.WaitOne()'CompletetheasynchronouscalltoAddXMLWebservicemethod.DimaddtotalAsSingle=math.EndAdd(result)'DisplayresultsinaLabelcontrol.Total.Text="Total:"&addtotal.ToString()EndSub</script><body><formaction="MathClient.aspx"runat=server><fontface="Verdana">EnterthetwonumbersyouwanttoaddandthenpresstheTotalbutton.<p>Number1:<asp:textboxid="Num1"runat=server/>+Number2:<asp:textboxid="Num2"runat=server/>=<asp:buttonid="Total_Button"text="Total"OnClick="EnterBtn_Click"runat=server/><p><asp:labelid="Total"runat=server/></font></form></body></html> 想获得更多关于异步通信的信息,请参阅后面的"和XMLWeb服务异步地通讯"。通过因特网产生许多服务请求可能影响客户应用程序的性能。当设计你的XMLWeb服务时,通过创建把有关信息集中在一起的方法可以有效利用服务请求。例如,假定你有一个XMLWeb服务,用来检索一本书的信息。我们可以创建一个在一条服务请求中返回所有的信息的方法,来代替单独的检索书名、作者和出版社的方法。一次传送大块的信息比多次传送小块的信息更有效率。 下面的代码示例解释如何把有关信息组织到单个XMLWeb服务方法中。 [C#] <%@WebServiceLanguage="C#"Class="DataService"%>usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Web.Services;publicclassDataService{[WebMethod]publicDataSetGetTitleAuthors(){SqlConnectionmyConnection=newSqlConnection("PersistSecurityInfo=False;IntegratedSecurity=SSPI;server=localhost;database=pubs");SqlDataAdaptermyCommand1=newSqlDataAdapter("select*fromAuthors",myConnection);SqlDataAdaptermyCommand2=newSqlDataAdapter("select*fromTitles",myConnection);DataSetds=newDataSet();myCommand1.Fill(ds,"Authors");myCommand2.Fill(ds,"Titles");returnds;}} [VisualBasic] <%@WebServiceLanguage="VB"Class="DataService"%>ImportsSystemImportsSystem.DataImportsSystem.Data.SqlClientImportsSystem.Web.ServicesPublicClassDataService<WebMethod>_PublicFunctionGetTitleAuthors()AsDataSetDimmyConnectionAsNewSqlConnection("PersistSecurityInfo=False;IntegratedSecurity=SSPI;server=localhost;database=pubs")DimmyCommand1AsNewSqlDataAdapter("select*fromAuthors",myConnection)DimmyCommand2AsNewSqlDataAdapter("select*fromTitles",myConnection)DimdsAsNewDataSet()myCommand1.Fill(ds,"Authors")myCommand2.Fill(ds,"Titles")ReturndsEndFunctionEndClass 当设计你的XMLWeb服务时,请确保使用标准的面向对象编程操作。使用封装来隐藏实现细节。对于更复杂的XMLWeb服务,你可以使用继承和多态性来再次使用代码并简化你的设计。 下面的代码示例显示如何使用继承来创建一个执行数学计算的XMLWeb服务。 [C#] <%@WebServiceLanguage="C#"Class="Add"%>usingSystem;usingSystem.Web.Services;abstractpublicclassMathService:WebService{ [WebMethod] abstractpublicfloatCalculateTotal(floata,floatb);}publicclassAdd:MathService{ [WebMethod] overridepublicfloatCalculateTotal(floata,floatb) {returna+b; }}publicclassSubtract:MathService{ [WebMethod] overridepublicfloatCalculateTotal(floata,floatb) {returna-b; }}publicclassMultiply:MathService{ [WebMethod] overridepublicfloatCalculateTotal(floata,floatb) {returna*b; }}publicclassDivide:MathService{ [WebMethod] overridepublicfloatCalculateTotal(floata,floatb) {if(b==0) return-1;else returna/b; }} [VisualBasic] <%@WebServiceLanguage="VB"Class="Add"%>ImportsSystemImportsSystem.Web.ServicesMustInheritPublicClassMathService:InheritsWebService<WebMethod>_PublicMustOverrideFunctionCalculateTotal(aAsSingle,_bAsSingle)AsSingleEndClassPublicClassAdd:InheritsMathService<WebMethod>PublicOverridesFunctionCalculateTotal(aAsSingle,bAsSingle)AsSingleReturna+bEndFunctionEndClassPublicClassSubtract:InheritsMathService<WebMethod>PublicOverridesFunctionCalculateTotal(aAsSingle,bAsSingle)AsSingleReturna-bEndFunctionEndClassPublicClassMultiply:InheritsMathService<WebMethod>PublicOverridesFunctionCalculateTotal(aAsSingle,bAsSingle)AsSingleReturna*bEndFunctionEndClassPublicClassDivide:InheritsMathService<WebMethod>PublicOverridesFunctionCalculateTotal(aAsSingle,bAsSingle)AsSingle Ifb=0ThenReturn-1 ElseReturna/b EndIfEndFunctionEndClass 使用输出缓冲来改善你的XMLWeb服务的性能。当输出缓冲开启时,服务请求的结果被保存在输出缓冲中一段指定的时间。如果一个类似的XMLWeb服务请求被产生,结果可以从缓冲中取得,而不用重新计算。这样就通过减少XMLWeb服务服务器所需的处理来改善了XMLWeb服务的反馈时间。高速缓存可在客户端和服务器两者上执行。Duration属性允许你指定高速缓冲保存XMLWeb服务输出的时间。 在客户端上使用输出高速缓冲的指令是: <%@OutputCacheDuration="60"%> 下面的代码示例显示如何在客户应用程序上使用Duration属性来指定输出高速缓冲为60秒。 [C#] <%@PageLanguage="C#"%><%@ImportNamespace="System.Net"%><%@OutputCacheDuration="60"VaryByParam="none"%><html><scriptlanguage="C#"runat="server">voidEnterBtn_Click(ObjectSrc,EventArgse){ MyMath.Mathmath=newMyMath.Math(); //CalltheXMLWebservice. floattotal=math.Add(Convert.ToInt32(Num1.Text), Convert.ToInt32(Num2.Text)); //DisplaytheresultsinaLabelcontrol. Total.Text="Total:"+total.ToString();}</script><body><formaction="MathClient.aspx"runat=server><fontface="Verdana">EnterthetwonumbersyouwanttoaddandpresstheTotalbutton.<p>Number1:<asp:textboxid="Num1"runat=server/>+Number2:<asp:textboxid="Num2"runat=server/>=<asp:buttonid="Total_Button"text="Total"OnClick="EnterBtn_Click"runat=server/><p><asp:labelid="Total"runat=server/></font></form></body></html> [VisualBasic] <%@PageLanguage="VB"%><%@ImportNamespace="System.Net"%><%@OutputCacheDuration="60"VaryByParam="none"%><html><scriptlanguage="VB"runat="server">SubEnterBtn_Click(SrcAsObject,eAsEventArgs) DimmathAsNewMyMath.Math() 'CalltheXMLWebservice. DimaddtotalAsSingle=math.Add(Convert.ToInt32(Num1.Text),Convert.ToInt32(Num2.Text)) 'DisplaytheresultsinaLabelcontrol. Total.Text="Total:"&addtotal.ToString()EndSub</script><body><formaction="MathClient.aspx"runat=server><fontface="Verdana">EnterthetwonumbersyouwanttoaddandpresstheTotalbutton.<p>Number1:<asp:textboxid="Num1"runat=server/>+Number2:<asp:textboxid="Num2"runat=server/>=<asp:buttonid="Total_Button"text="Total"OnClick="EnterBtn_Click"runat=server/><p><asp:labelid="Total"runat=server/></font></form></body></html> 你还可以使用WebMethod属性类的CacheDuration属性来在服务器上允许高速缓冲。下面的代码示例显示如何在XMLWeb服务方法上使用CacheDuration属性来指定输出高速缓冲为60秒。 [C#] <%@WebServiceLanguage="C#"Class="MathService"%>usingSystem;usingSystem.Web.Services;publicclassMathService:WebService{[WebMethod(CacheDuration=60)]publicfloatAdd(floata,floatb){returna+b;}[WebMethod(CacheDuration=60)]publicfloatSubtract(floata,floatb){returna-b;}[WebMethod(CacheDuration=60)]publicfloatMultiply(floata,floatb){returna*b;}[WebMethod(CacheDuration=60)]publicfloatDivide(floata,floatb){if(b==0)return-1;returna/b;}} [VisualBasic] <%@WebServiceLanguage="VB"Class="MathService"%>ImportsSystemImportsSystem.Web.ServicesPublicClassMathServiceInheritsWebService<WebMethod(CacheDuration:=60)>_PublicFunctionAdd(aAsSingle,bAsSingle)AsSingleReturna+bEndFunction<WebMethod(CacheDuration:=60)>_PublicFunctionSubtract(aAsSingle,bAsSingle)AsSingleReturna-bEndFunction<WebMethod(CacheDuration:=60)>_PublicFunctionMultiply(aAsSingle,bAsSingle)AsSingleReturna*bEndFunction<WebMethod(CacheDuration:=60)>_PublicFunctionDivide(aAsSingle,bAsSingle)AsSingleIfb=0ThenReturn-1EndIfReturna/bEndFunctionEndClass 当设计你的XMLWeb服务时,努力遵循如何格式化模式的结构。 XMLWeb服务使用SOAP作为主要的传送和序列化协议。一个SOAP消息由一个可选择的头体和消息体组成。头部分包含可以被Web服务器体系结构处理的信息。SOAP没有定义任何头。消息体部分包含由应用程序处理的信息,例如用于XMLWeb服务的参数或返回值。 提供用于你的XMLWeb服务的文档,如一个静态HTML文件,描述你的服务的操作和数据结构。还包括如何使用这个XMLWeb服务的示例。不要依靠服务描述或服务帮助页面作为你唯一的文档。
文章
XML  ·  .NET  ·  C#  ·  网络架构  ·  数据格式  ·  开发框架  ·  开发者
2008-09-14
运用C#创建一个.Net下的Web Service
微软在其.net战略中,对其主推的Web Service做了大肆的宣扬。现在,Web Service正如火如荼地发展着,相关的各项新技术层出不穷。Web Service的发展正构筑着互联网时代美好的明天。在本文中,我将向大家介绍Web Service的一些基本知识、如何用C#建立一个Web Service。通过文章,我们还将对WSDL、UDDI以及未来的Web Service有一个大致的了解。   为什么需要Web Service?   以前,分布式的应用程序逻辑需要使用分布式的对象模型,通过使用DCOM、CORBA、RMI之类的基本结构,开发人员仍可拥有使用本地模型所提供的丰富资源和精确性,并可将服务置于远程系统中。   当已经有中意的中间件平台(RMI、Jini、CORBA、DCOM 等等)时,我们为什么还要为Web而烦恼呢?中间件确实提供了强大的服务实现手段,但是,这些系统有一个共同的缺陷,那就是它们无法扩展到互联网上:它们要求服务客户端与系统提供的服务本身之间必须进行紧密耦合,即要求一个同类基本结构。然而这样的系统往往十分脆弱:如果一端的执行机制发生变化,那么另一端便会崩溃。例如,如果服务器应用程序的接口发生更改,那么客户端便会崩溃。为了能扩展到互联网运用,我们需要一种松散偶合的基本结构来解决这个问题。如此的情况下就迎来了Web Service的诞生。   什么是Web Service?   Web Service 是一种新的Web应用程序分支,他们是自包含、自描述、模块化的应用,可以发布、定位、通过Web调用。Web Service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。   Web Service是一种应用程序,它运用了Web网络技术和基于组件开发的精华成分。可以使用标准的互联网协议,像超文本传输协议(HTTP)和XML,将功能纲领性地体现在互联网和企业内部网上。像DCOM、RMI、IIOP等基于组件的对象模型已经流行了较长一段时间了。然而这些模型都是依赖于一个特定的对象模型协议。Web Service扩展了这些模型,使之可以和简单对象访问协议(Simple Object Access Protocol,SOAP)以及XML通信以根除特定对象模型协议带来的障碍。可将WebService视作Web上的组件编程。(参见如图1)   Web Service基本上是利用超文本传送协议(HTTP)和SOAP来使商业数据可以在网上获得。它将商业对象(COM对象、Java Beans等)显露给在HTTP上的SOAP调用并执行远程功能调用。因此,Web Service的使用者可以在远程对象上通过SOAP和HTTP在Web上进行方法调用。   图1   SOAP调用是一类能引起在位置B上的Web Service组件程序执行的调用。之后,程序执行的结果就以XML文档的形式返回给在位置A上的用户。   在图1中,在位置A的用户怎么知道在位置B的用户的一些情况的呢?这个就要涉及到一个通用标准。服务描述语言(Service Description Language, SDL),SOAP契约语言(SOAP Contract Language,SCL)以及网络可访问性规格语言(Network Accessible Specification Language,NASSL)都是为了这个目的而建立的XML类语言。然而,IBM和微软最近同意将Web服务描述语言(Web Service Description Language,WSDL)作为Web Service的标准。   Web Service组件的结构是通过Web服务描述语言来显露的。   面临的任务   学会Web Service的最好方法就是自己动手做一个实例。我们都熟悉股票报价服务,纳斯达克、道琼斯都是很著名的例子。它们都提供一个输入公司代号并取得最新的股票价格的接口。本文我们就设法设计出同样的功能。   创建Web Service的工具   本文我们通过MS.Net Framework SDK来实现这个程序。   创建Web Service的比较好的集成开发环境(IDE)是Visual Studio.Net。然而,你也可以很容易的用任何文本编辑器(记事本、写字板、Visual Studio 6.0)来创建一个Web Service文件。还有,你必须熟悉以下概念:   Net平台的基础知识   C#的基础知识   面向对象概念的基础知识   创建一个Web Service   下面,我们将用C#建立一个名为“SecurityWebService”的Web Service。一个Web Service文件将含有形式为.asmx的扩展名。(就像Asp.net的文件扩展名为.aspx) <%@ WebService Language="C#" class="SecurityWebService" %>     这条语句将告诉编译器程序将运行在Web Service模式下以及C#类的名称。同时我们要访问Web Service的名字空间。还有,最好添加一个对System名字空间的引用。 using System;using System.Web.Services;   该SecurityWebService的类应该继承Web Service类的功能。因此,我们添加了下面这行代码: public class SecurityWebService : WebService   现在我们来运用我们的面向对象的技巧编写一个C#类。C#的类和C++、Java的类非常相象,如果你有C++和Java的基础,这个就是小菜一碟了。   .Net下的Web Service能够设定一些基本的数据类型。因此,如果我们返回“int”、“float”或是“string”等数据类型的话,它能自动将它们转化为标准的XML输出。然而不巧的是在大多数的情况下,我们需要同一个实体的一类数据集。下面我先举个例子。我们的SecurityWebService股票报价服务要求用户输入一个公司的代号,然后它会给出公司的全名以及当前的股票价格。由此,我们需要一个公司的三条信息:   公司代号(数据类型:string) 公司全名(数据类型:string) 股票价格(数据类型:double)   我们需要将单个股票报价的数据信息分解开。可以有很多方法完成此项工作,我们这里用了最好的枚举数据类型。我们在C#中用了“structs”,和C++中的structs一样。代码如下: public struct SecurityInfo { public string Code; public string CompanyName; public double Price; }   现在我们已经完成所有建立Web Service所需的模块了。因此,所有的代码如下: <%@ WebService Language="C#" class="SecurityWebService" %> using System; using System.Web.Services; public struct SecurityInfo { public string Code; public string CompanyName; public double Price; } public class SecurityWebService : WebService { private SecurityInfo Security; public SecurityWebService() { Security.Code = ""; Security.CompanyName = ""; Security.Price = 0; } private void AssignValues(string Code) { // 在这里使用商业组件 // 方法调用就是用来获得所需的数据的 // 本程序中我给相应的代码添加了一个对应的字符串以方便显示 // 同时,我使用了随机数产生器来生成股票价格 Security.Code = Code; Security.CompanyName = Code + " Pty Ltd"; Random RandomNumber = new System.Random(); Security.Price = double.Parse(new System.Random(RandomNumber.Next(1,10)).NextDouble().ToString("##.##")); } [WebMethod(Description="This method call will get the company name and the price for a given security code.",EnableSession=false)] public SecurityInfo GetSecurityInfo(string Code) { AssignValues(Code); SecurityInfo SecurityDetails = new SecurityInfo(); SecurityDetails.Code = Security.Code; SecurityDetails.CompanyName = Security.CompanyName; SecurityDetails.Price = Security.Price; return SecurityDetails; }请记住,这个Web Service能通过Http做任何使用。我们也许会在代码中涉及到一些很敏感的商业数据,但是却不想它落入他人之手。那解决的方案就是保护一些逻辑函数,使用户只能访问到一些用来显示数据的函数。为了达到这个目的,我们使用了关键字“[Web Method]”。下面就是示例代码: [WebMethod(Description="This......",EnableSession=false)] public SecurityInfo GetSecurityInfo(string Code)   这个函数的访问类型是公有型的。标签“Description”是用来描述这个Web Service的功能的。因为我们不必储存任何session数据,所以我们将session状态设置为false。 private void AssignValues(string Code)   这是一个应该被逻辑保护的函数。因为我们不希望我们的商业机密数据能在Web被轻易的获得,所以我们将函数的访问类型设为private(注:在这里,即使你将函数的访问类型设为public,这个函数还是不能被公共地访问到,原因是关键字“[Web Method]”没有被用到)。   到此,我们可以用GetSecurityInfo(string)函数来获得最新的股票价格。同时,为了方便起见,我给公司代码添加了相应公司的名字。还有,股票的价格是随机产生的。   最后,我们将该文件保存在一个由IIS控制的目录下,文件名为“SampleService.asmx”。运行后的图示如下:   图2   以上是一个由.Net Framework生成的Web页面,我们并没有创建这个页面(它是由系统自动产生的,所以我并不需要写任何代码来创建该页面)。这个功能使我们的工作量相对减轻了不少。同样,你也可以通过运用Asp.net的Pagelets功能或修改网页文件使页面以不同的方式显示其中的内容。       如何使用这个Web Service?       现在我们来使用这个Web Service。我们先输入一些值来获得股票示例价格。   图3   按下Invoke按钮,我们就可以获得以下的XML文档:   图4这样,这个Web Service就给用户提供了其所需的信息了。因为是XML格式的文档,我们需要写客户端来析取这个XML文档。客户端可以为以下几类:   1.一个Web页面 2.一个控制台或是Windows下的运用程序 3.一个用WML语言描述的手机程序 4.一个运用在PDA上的Palm或Win CE程序   你可以直接用Http Get方法来调用这个Web Service。这样的话就不会出现第一个页面了,也不需要用户去点击Invoke按钮了。具体方法:   http://server/webServiceName.asmx/functionName?parameter=parameterValue   调用我们的Web Service的方法就是:   http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo?Code=IBM   到此为止,我们已经知道如何用C#创建并使用一个Web Service,但是任务并没有完全完成。我们需要知道如何在Internet上找到我们的Web Service,我们的Web Service能不能也被收入在个大搜索引擎。为了解决这个问题,我们就需要建立一个“discovery”文件。   创建发现文件   在访问一个已有的Web Service以前,你必须先得找到并整合这个Web Service,这个过程就是Web Service的发现过程。通过这个发现过程,你才知道这个Web Service能为你提供什么样的服务以及你怎么和它实现互动。发现文件是一个以.DISCO为扩展名的XML文件。在实际运用中,你是不必为每一个Web Service创建发现文件的。以下就是一个发现文件的例子: <?xml version="1.0" ?> <disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco/"> <scl:contractRef ref="http://localhost/work/aspx/SampleService.asmx?SDL"/> </disco:discovery>   我们先将这个文件命名为“SampleService.disco”,并将它保存在该Web Service的目录下。如果我们是在“/work/aspx”目录下创建Web Service的话,我们就可以运用更灵活的“动态发现”了。“动态发现”能自动为我们检测“/work/aspx”目录以及子目录下的所有*.DISCO文件的,这样就省了我们不少功夫。 <?xml version="1.0" ?> <dynamicDiscovery xmlns="urn:schemas-dynamicdiscovery:disco.2000-03-17"> </dynamicDiscovery>   你可以在http://services3.xmethods.net/dotnet/default.disco获得一份能使用的发现文件。通过分析发现文件,我们可以找到所需的Web Service。然而,在得到发现文件前你必须知道这个发现文件的确切的URL。否则你还是找不到你要的发现文件的,那么你当然就不能找到你要的Web Service了。这样,我们现在就要用到一项新技术了――通用发现,描述和整合(Universal Description,Discovery,and Integration,UDDI)来为已存在的Web Service做宣传了。UDDI是公开的,基于Internet的。这项技术目前还处于起初阶段,所以正不断发展着。你可以在http://uddi.microsoft.com/ 获得有关UDDI的参考。   发布这个Web Service   发布Web Service是很简单的。和Asp.net的程序差不多,你只要将.asmx文件和.disco文件拷贝到相应的目录,这样如果一切正常,这个Web Service就可以工作了。   展望Web Service的未来   Web Service技术的前途是相当光明的。在推动Web Service技术向前发展的道路上,不仅微软注入了很大的投资,Sun、IBM等也表示很大的兴趣。同时,网上还有为Apache和Java Web开发的SOAP工具包。然而,Web Service起步不久,还需要很多的工作要做。特别在国内,Web Service技术起步比国外有晚了一步,所以更要抓紧时间、迎接挑战。 } 本文转自yonghu86 51CTO博客,原文链接:http://blog.51cto.com/yonghu/1321399,如需转载请自行联系原作者
文章
Web App开发  ·  XML  ·  C#  ·  C++  ·  数据格式
2017-11-16
运用C#创建一个.Net下的Web Service
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/4328112 运用C#创建一个.Net下的Web Service 本文关键词: Service Web 创建 NET 微软在其.net战略中,对其主推的Web Service做了大肆的宣扬。现在,Web Service正如火如荼地发展着,相关的各项新技术层出不穷。Web Service的发展正构筑着互联网时代美好的明天。在本文中,我将向大家介绍Web Service的一些基本知识、如何用C#建立一个Web Service。通过文章,我们还将对WSDL、UDDI以及未来的Web Service有一个大致的了解。   为什么需要Web Service?   以前,分布式的应用程序逻辑需要使用分布式的对象模型,通过使用DCOM、CORBA、RMI之类的基本结构,开发人员仍可拥有使用本地模型所提供的丰富资源和精确性,并可将服务置于远程系统中。   当已经有中意的中间件平台(RMI、Jini、CORBA、DCOM 等等)时,我们为什么还要为Web而烦恼呢?中间件确实提供了强大的服务实现手段,但是,这些系统有一个共同的缺陷,那就是它们无法扩展到互联网上:它们要求服务客户端与系统提供的服务本身之间必须进行紧密耦合,即要求一个同类基本结构。然而这样的系统往往十分脆弱:如果一端的执行机制发生变化,那么另一端便会崩溃。例如,如果服务器应用程序的接口发生更改,那么客户端便会崩溃。为了能扩展到互联网运用,我们需要一种松散偶合的基本结构来解决这个问题。如此的情况下就迎来了Web Service的诞生。   什么是Web Service?   Web Service 是一种新的Web应用程序分支,他们是自包含、自描述、模块化的应用,可以发布、定位、通过Web调用。Web Service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。   Web Service是一种应用程序,它运用了Web网络技术和基于组件开发的精华成分。可以使用标准的互联网协议,像超文本传输协议(HTTP)和XML,将功能纲领性地体现在互联网和企业内部网上。像DCOM、RMI、IIOP等基于组件的对象模型已经流行了较长一段时间了。然而这些模型都是依赖于一个特定的对象模型协议。Web Service扩展了这些模型,使之可以和简单对象访问协议(Simple Object Access Protocol,SOAP)以及XML通信以根除特定对象模型协议带来的障碍。可将WebService视作Web上的组件编程。(参见如图1)   Web Service基本上是利用超文本传送协议(HTTP)和SOAP来使商业数据可以在网上获得。它将商业对象(COM对象、Java Beans等)显露给在HTTP上的SOAP调用并执行远程功能调用。因此,Web Service的使用者可以在远程对象上通过SOAP和HTTP在Web上进行方法调用。   图1   SOAP调用是一类能引起在位置B上的Web Service组件程序执行的调用。之后,程序执行的结果就以XML文档的形式返回给在位置A上的用户。   在图1中,在位置A的用户怎么知道在位置B的用户的一些情况的呢?这个就要涉及到一个通用标准。服务描述语言(Service Description Language, SDL),SOAP契约语言(SOAP Contract Language,SCL)以及网络可访问性规格语言(Network Accessible Specification Language,NASSL)都是为了这个目的而建立的XML类语言。然而,IBM和微软最近同意将Web服务描述语言(Web Service Description Language,WSDL)作为Web Service的标准。   Web Service组件的结构是通过Web服务描述语言来显露的。   面临的任务   学会Web Service的最好方法就是自己动手做一个实例。我们都熟悉股票报价服务,纳斯达克、道琼斯都是很著名的例子。它们都提供一个输入公司代号并取得最新的股票价格的接口。本文我们就设法设计出同样的功能。   创建Web Service的工具   本文我们通过MS.Net Framework SDK来实现这个程序。   创建Web Service的比较好的集成开发环境(IDE)是Visual Studio.Net。然而,你也可以很容易的用任何文本编辑器(记事本、写字板、Visual Studio 6.0)来创建一个Web Service文件。还有,你必须熟悉以下概念:   Net平台的基础知识   C#的基础知识   面向对象概念的基础知识   创建一个Web Service   下面,我们将用C#建立一个名为“SecurityWebService”的Web Service。一个Web Service文件将含有形式为.asmx的扩展名。(就像Asp.net的文件扩展名为.aspx) <%@ WebService Language="C#" class="SecurityWebService" %>     这条语句将告诉编译器程序将运行在Web Service模式下以及C#类的名称。同时我们要访问Web Service的名字空间。还有,最好添加一个对System名字空间的引用。 using System;using System.Web.Services;   该SecurityWebService的类应该继承Web Service类的功能。因此,我们添加了下面这行代码: public class SecurityWebService : WebService   现在我们来运用我们的面向对象的技巧编写一个C#类。C#的类和C++、Java的类非常相象,如果你有C++和Java的基础,这个就是小菜一碟了。   .Net下的Web Service能够设定一些基本的数据类型。因此,如果我们返回“int”、“float”或是“string”等数据类型的话,它能自动将它们转化为标准的XML输出。然而不巧的是在大多数的情况下,我们需要同一个实体的一类数据集。下面我先举个例子。我们的SecurityWebService股票报价服务要求用户输入一个公司的代号,然后它会给出公司的全名以及当前的股票价格。由此,我们需要一个公司的三条信息:   公司代号(数据类型:string)  公司全名(数据类型:string)  股票价格(数据类型:double)   我们需要将单个股票报价的数据信息分解开。可以有很多方法完成此项工作,我们这里用了最好的枚举数据类型。我们在C#中用了“structs”,和C++中的structs一样。代码如下: public struct SecurityInfo{public string Code;public string CompanyName;public double Price;}   现在我们已经完成所有建立Web Service所需的模块了。因此,所有的代码如下: <%@ WebService Language="C#" class="SecurityWebService" %> using System;using System.Web.Services; public struct SecurityInfo{public string Code;public string CompanyName;public double Price;} public class SecurityWebService : WebService{private SecurityInfo Security; public SecurityWebService(){Security.Code = "";Security.CompanyName = "";Security.Price = 0;} private void AssignValues(string Code){// 在这里使用商业组件// 方法调用就是用来获得所需的数据的// 本程序中我给相应的代码添加了一个对应的字符串以方便显示// 同时,我使用了随机数产生器来生成股票价格 Security.Code = Code;Security.CompanyName = Code + " Pty Ltd";Random RandomNumber = new System.Random();Security.Price = double.Parse(new System.Random(RandomNumber.Next(1,10)).NextDouble().ToString("##.##"));} [WebMethod(Description="This method call will get the company name and the price for a given security code.",EnableSession=false)]public SecurityInfo GetSecurityInfo(string Code){AssignValues(Code);SecurityInfo SecurityDetails = new SecurityInfo();SecurityDetails.Code = Security.Code;SecurityDetails.CompanyName = Security.CompanyName;SecurityDetails.Price = Security.Price;return SecurityDetails;}请记住,这个Web Service能通过Http做任何使用。我们也许会在代码中涉及到一些很敏感的商业数据,但是却不想它落入他人之手。那解决的方案就是保护一些逻辑函数,使用户只能访问到一些用来显示数据的函数。为了达到这个目的,我们使用了关键字“[Web Method]”。下面就是示例代码: [WebMethod(Description="This......",EnableSession=false)] public SecurityInfo GetSecurityInfo(string Code)   这个函数的访问类型是公有型的。标签“Description”是用来描述这个Web Service的功能的。因为我们不必储存任何session数据,所以我们将session状态设置为false。 private void AssignValues(string Code)   这是一个应该被逻辑保护的函数。因为我们不希望我们的商业机密数据能在Web被轻易的获得,所以我们将函数的访问类型设为private(注:在这里,即使你将函数的访问类型设为public,这个函数还是不能被公共地访问到,原因是关键字“[Web Method]”没有被用到)。   到此,我们可以用GetSecurityInfo(string)函数来获得最新的股票价格。同时,为了方便起见,我给公司代码添加了相应公司的名字。还有,股票的价格是随机产生的。   最后,我们将该文件保存在一个由IIS控制的目录下,文件名为“SampleService.asmx”。运行后的图示如下:   图2   以上是一个由.Net Framework生成的Web页面,我们并没有创建这个页面(它是由系统自动产生的,所以我并不需要写任何代码来创建该页面)。这个功能使我们的工作量相对减轻了不少。同样,你也可以通过运用Asp.net的Pagelets功能或修改网页文件使页面以不同的方式显示其中的内容。       如何使用这个Web Service?       现在我们来使用这个Web Service。我们先输入一些值来获得股票示例价格。   图3   按下Invoke按钮,我们就可以获得以下的XML文档:   图4这样,这个Web Service就给用户提供了其所需的信息了。因为是XML格式的文档,我们需要写客户端来析取这个XML文档。客户端可以为以下几类:   1.一个Web页面  2.一个控制台或是Windows下的运用程序  3.一个用WML语言描述的手机程序  4.一个运用在PDA上的Palm或Win CE程序   你可以直接用Http Get方法来调用这个Web Service。这样的话就不会出现第一个页面了,也不需要用户去点击Invoke按钮了。具体方法:   http://server/webServiceName.asmx/functionName?parameter=parameterValue   调用我们的Web Service的方法就是:   http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo?Code=IBM   到此为止,我们已经知道如何用C#创建并使用一个Web Service,但是任务并没有完全完成。我们需要知道如何在Internet上找到我们的Web Service,我们的Web Service能不能也被收入在个大搜索引擎。为了解决这个问题,我们就需要建立一个“discovery”文件。   创建发现文件   在访问一个已有的Web Service以前,你必须先得找到并整合这个Web Service,这个过程就是Web Service的发现过程。通过这个发现过程,你才知道这个Web Service能为你提供什么样的服务以及你怎么和它实现互动。发现文件是一个以.DISCO为扩展名的XML文件。在实际运用中,你是不必为每一个Web Service创建发现文件的。以下就是一个发现文件的例子: <?xml version="1.0" ?><disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco/"><scl:contractRef ref="http://localhost/work/aspx/SampleService.asmx?SDL"/></disco:discovery>   我们先将这个文件命名为“SampleService.disco”,并将它保存在该Web Service的目录下。如果我们是在“/work/aspx”目录下创建Web Service的话,我们就可以运用更灵活的“动态发现”了。“动态发现”能自动为我们检测“/work/aspx”目录以及子目录下的所有*.DISCO文件的,这样就省了我们不少功夫。 <?xml version="1.0" ?><dynamicDiscovery xmlns="urn:schemas-dynamicdiscovery:disco.2000-03-17"></dynamicDiscovery>   你可以在http://services3.xmethods.net/dotnet/default.disco获得一份能使用的发现文件。通过分析发现文件,我们可以找到所需的Web Service。然而,在得到发现文件前你必须知道这个发现文件的确切的URL。否则你还是找不到你要的发现文件的,那么你当然就不能找到你要的Web Service了。这样,我们现在就要用到一项新技术了――通用发现,描述和整合(Universal Description,Discovery,and Integration,UDDI)来为已存在的Web Service做宣传了。UDDI是公开的,基于Internet的。这项技术目前还处于起初阶段,所以正不断发展着。你可以在http://uddi.microsoft.com/ 获得有关UDDI的参考。   发布这个Web Service   发布Web Service是很简单的。和Asp.net的程序差不多,你只要将.asmx文件和.disco文件拷贝到相应的目录,这样如果一切正常,这个Web Service就可以工作了。   展望Web Service的未来   Web Service技术的前途是相当光明的。在推动Web Service技术向前发展的道路上,不仅微软注入了很大的投资,Sun、IBM等也表示很大的兴趣。同时,网上还有为Apache和Java Web开发的SOAP工具包。然而,Web Service起步不久,还需要很多的工作要做。特别在国内,Web Service技术起步比国外有晚了一步,所以更要抓紧时间、迎接挑战。 }
文章
Web App开发  ·  XML  ·  C#  ·  C++  ·  数据格式
2009-07-07
C#远程调用技术WebService修炼手册
一、课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上。所以在本次分享课开课之前,我们要“约法三章”不谈论以下几个比较“严肃”和“敏感”的话题:WebService已经过时了啦,学习它干什么用啊!为什么要用WebService,而不用基于当前流行的RestFul ASP.NET WebAPI ?  对于上面的问题阿笨的回答很简单:因为它就是它,不一样烟火的WebService! 本次分享课您将学习到以下干货知识点: 1)、WebService技术调用原理图。 2)、C# WebService常用的几种调用方式。 3)、C# WebService调试小技巧和开发必备工具分享。 4)、实战演练之如何通过优雅的方式进行WebService调用。  优不优雅,你看了就知道了,我们尽可能的Write Less Do More !(强烈推荐) 在此插播一条硬广告:下一堂分享课程阿笨计划将给大家带来《C#远程调用技术WebService葵花宝典》,课程的重点将给大家分享一下“C# WebService两种不同引用使用方式”,“WebService如何使用异步调用”以及“关于C# WebService如何让客户端以安全的方式进行调用目前常用几种的解决方案”等等。阿笨尽量给大家带来一些干货分享! 如果您对本次分享课感兴趣的话,那么请跟着阿笨一起学习吧。废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 hi大家好,我的名字叫WebService! 二、概念名称含义解释 2.1、什么是远程调用技术(简称:RPC技术)? 一个系统远程调用另一个系统的服务,来获取远程系统的业务数据。 2.2、为什么使用RPC技术? 基于安全性的考虑,一般企业不会开放自己的数据库,只能使用远程调用技术。 2.3、什么是SOAP? SOAP:(Simple Object Access Protocol)简单对象存取协议。SOAP最早是针对RPC的一种解决方案;SOAP是XML文档形式的调用方法的规范。 2.4、什么是WebService? WebService是一种使用HTTP传输的SOAP协议的远程调用技术。 2.5、WebService采用的是什么通信协议? WebService 采用的的基本通信协议是SOAP ,它是在分散或分布式环境中交换信息,它基于XML的协议,通过SOAP协议可以实现不同项目、不同地点、甚至异地调用应用程序。 2.6、为什么说WebService是跨平台的? 实际上,WebService 的主要目标是跨平台的可互操作性。为了达到这一目标,WebService 完全基于XML (可扩展标记语言)、XSD (XMLSchema )等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。 2.7、WebService实现包含那三要素? WSDL作用:webservice服务端的使用说明书。(Web Service Description Language) SOAP作用:规范XML标签。 UDDI:提供webservice服务端的搜索和注册功能。 2.8、WebService有哪些优势? 1)、可操作的的分布式应用程序。 可以实现不同应用程序和在不同系统平台上开发出来的应用程序之间通信。 2)、普遍性、使用HTTP和XML进行通信。 任何支持HTTP和XML 技术的设备都可以拥有和访问Web Service,不同平台不同开发语言照样可以调用我们发布的Web Service。 3)、Web Service 甚至可以穿越防火墙,真正的自由通信。 一般要访问的Web服务器以及要访问的Web Service的客户端很可能位于防火墙后面,都默认关闭其它端口而开发HTTP端口,而Web service 正是基于HTTP的,所以它可以穿越防火墙. 4)、异构平台之间的互通性。 Web Service 最大的优势是提供了异构平台的无缝街接技术手段。由于不同的用户使用不同的硬件平台,不同的操作平台,不同的操作系统,不同的软件,不同的 协议通信,这就产生了互相通信的需求。 Web Service 使任何两个应用程序,只要能读写XML,那么就能互相通信。 通过 SOAP 协议实现异地调用。 小结: 阿笨用通俗一点语言解释就是在当前C#、JAVA、PHP等语言都可以使用标准的WebService技术实现不同语言的应用程序之间进行互相通信,即互相调用。 三、WebService技术调用原理图 WebService工作原理图一 WebService工作原理图二 3.1、Webservice是如何实现远程调用?三要素在webservice的作用? (1)Webservice原理:webservice是一种使用http传输的SOAP协议的数据的远程调用技术。 (2) WSDL作用:webservice服务端的使用说明书。(Web Service Description Language) (3)SOAP作用:规范XML标签。 (4) UDDI:提供webservice服务端的搜索和注册功能。 3.2、WebService关键原理说明: 服务者:发布者需要部署Webservice服务应用程序。 调用者:客户端需要参考webservice服务端的使用说明书(WSDL)进行调用。 四、C# WebService常用的几种调用方式 4.1、C#通过Dynamic动态调用WebService。  其实与手工创建添加引用步骤一样,只是在这里把手动变成了自动而已,动态生成代理类,利用反射动态调用了方法。详细请参考:[C#通过Dynamic动态调用WebService.pdf]文档。 4.2、C#通过模拟HTTP请求协议Get、POST方式进行调用WebService。(根据个人项目情况使用) 详细请参考:[C#通过模拟HTTP请求协议Get、POST方式进行调用WebService.pdf]文档。 4.3、通过手动生成客户端WSDL代理类进行调用。(根据个人项目情况使用) 采用微软给我们提供的wsdl.exe工具生成wsdl本地代理类。 4、通过SOAP协议手动引用方式进行调用。(微软强烈推荐) 五、C# WebService调试小技巧和开发必备工具分享 5.1、C# 如何调试WebService服务以及调试远程Web服务。 详细请参考[C# WebService如何远程调试.pdf] 5.2、Webservice调试利器 1、微软提供的.NET WebService Studio 下载地址:http://webservicestudio.codeplex.com/ 2、Storm (推荐) 下载地址:http://storm.codeplex.com/ ,顺便提及下该工具还有一个它的“同胞兄弟”叫 WCF Storm 哦。 3、soapui(强烈推荐)     下载地址:https://www.soapui.org/downloads/latest-release.html 六、实战演练之如何通过优雅的方式进行WebService调用 统一入口获取指定T类型的WebService服务实例 客户端调用者将采用统一入口进行访问 七、WebService修炼手册在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
文章
Web App开发  ·  XML  ·  C#  ·  网络架构  ·  数据格式
2018-03-10
使用ASP.Net 3.5 的Ajax与Web服务开发实例
本文继续介绍使用ASP.NET3.5中的AJAX环境中如何从客户端JavaScript调用Web服务方法。编写本文的目的在于让大家深刻了解基于ASP.Net3.5的Ajax和Web的服务,虽然例子比较简单,但是比较能说明问题。在这里我又介绍了命名空间System. Web.Script的方式确定客户端调用Web服务方法。        在AJAX中调用Web服务方法可以提高Web用户的体验,微软在ASP.NET3.5中的AJAX加入了它的新功能,新的功能可以从客户端JavaScript调用Web服务方法无刷新整个页面。AJAX技术使你能够调用服务器端的方法,没有post back。客户端脚本可以提出请求的Web方法,并可以通过数据作为输入参数的方法和数据也可以从服务器发回给客户端浏览器。         为了使你的应用程序调用的ASP.NET Web service使用客户端脚本,服务器异步通信层会自动生成的JavaScript代理类。代理类生成为每个Web服务的   一个<asp:ServiceReference>元素被列入<asp:ScriptManager>控制的页面。  <asp:ScriptManager runat="server" ID="scriptManagerId">      <Services>             <asp:ServiceReference  Path="WebService.asmx" />      </Services></asp:ScriptManager>      这是下载的代理类的浏览器在网页加载时间,并提供了一个客户端对象,代理调用方法的Web服务。在调用相应的方法所产生的JavaScript的代理类。该代理类打开通信与网络服务。这些请求通过的XMLHTTP对象的浏览器异步通讯。          如下图所示,详细规定了不同的层上的客户机和服务器方面通讯框架。         <asp:ScriptReference>元素指定注册一个JavaScript文件,用来在网页中。只有在注册CallWebServiceMethod.js文件,您才可以在方法上进行调用,调用Web服务方法的脚本是异步的。获得返回值或以确定何时返回的请求,您必须提供一个成功的回调函数。回调函数被调用时,请求已成功完成,并且它包含的返回值(如果有的话)从Web方法调用。您也可以提供一个失败的回调函数来处理错误。此外,您还可以通过用户的背景资料,使用中的回调函数。 如下图,是WCF和Ajax调用Web service时序图。       在上一篇文章(基于ASP.NET 3.5 Web Service 的JSON扩展应用)中已经讲过,JSON - JavaScript对象符号是默认序列化格式,使用它进行数据转换之间客户端服务器请求。您可以禁用所有目前启用的协议像HTTP-GET、HTTP-POST,甚至的XML格式的SOAP中使用的早期形式的Web服务。以下设置在Web.config文件同样也是这样使用。 <system.web>     <webServices>         <protocols>           <clear/>         </protocols>       </webServices></system.web>         请求一个Web服务方法通过这些层面。你可以看到如何使用一种方法,要求在一个可用的代理对象和Web请求中,并由一个XMLHttp对象在客户端浏览器端运行。在服务器端,你的要求是与往常一样是由一个HTTP处理程序,发出的XML/JSON序列化。   如下图所示,asp.net 3.5调用Ajax与Web服务的类关系图。                                                     在AJAX中使用Web服务方法包括两个步骤:第一步是,创建和定义Web服务。第二个步,是使用客户端脚本来从一个网页的服务通话方法。创建一个Web服务: 在System.Web.Scripts.Services命名空间,你可能会发现一个属性类“ScriptSrvice ”,这需要适用于Web服务类,使Web服务方法可以调用来自客户端的脚本。这将使代理生成脚本来生成一个代理对象对应于Web服务类。           同样,在相同的命名空间,可能会发现另一个属性类“ScriptMethod”,如果采用此属性为Web方法,你可以指定哪些HTTP动词是用来调用一个方法和响应形式。此属性有三个参数描述如下:           UseHttpGet :如果设置为true,将调用该方法使用HTTP GET命令。默认值为false 。       ResponseFormat :指定是否反应将序列化的简JSON或XML 。默认值为JSON。       XmlSerializeString :指定是否所有返回类型,包括字符串类型,是为XML序列化的值将被忽略XmlSerializeString连续的响应来系列化的JSON 。         现在,创建新的Web使用ASP.NET Web Service模板在Microsoft Visual Studio 2008和修改Web服务类如下: using System.Web.Script.Services;namespace AjaxWebService {     [WebService(Namespace = "http://localhost:1382/AjaxWebService/")]     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]     [ScriptService]     public class Service : System.Web.Services.WebService     {         string myXmlData = @"<?xml version=""1.0"" encoding=""utf-8"" ?>                 <Book>                     <Title>Programming ASP.NET 3.5, AJAX and Web Services</Title>                 </Book>";                 /// <summary>         /// This method uses JSON response formatting          /// </summary>         /// <param name="months"></param>         /// <returns></returns>        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]         [WebMethod]         public string getNextBackupDate(int months)         {             return DateTime.Now.AddMonths(months).ToShortDateString();         }                  /// <summary>         /// This method uses XML response formatting         /// </summary>         /// <returns></returns>        [ScriptMethod(ResponseFormat = ResponseFormat.Xml)]         [WebMethod]         public XmlDocument GetBookTitle()         {             XmlDocument xmlDoc = new XmlDocument();             xmlDoc.LoadXml(myXmlData);             return xmlDoc;         }                 /// <summary>         /// This method uses HTTP-GET protocol to call it         /// </summary>         /// <returns></returns>        [ScriptMethod(UseHttpGet = true)]         [WebMethod]         public string HelloWorld()         {             return "Hello, world";         }     } }    注:Web服务创建的ScriptService使用如上将不会被浏览器默认。您需要修改文件中的设置Web.config文件如下,以测试上述Web服务。 <webServices>      <protocols>        <add name="HttpGet"/>         <add name="HttpPost"/>     </protocols></webServices>         调用Web服务方法使用客户端脚本,Asp.Net Web服务方法可以说是从客户端脚本异步不回传,并没有刷新整个页面。只有其之间传输数据的服务器和客户端的浏览器。 目前,.NET 3.5框架支持Web服务和客户端的网页可以在相同的域(同一网站)。   现在增加一个新的“Ajax激活Web页” ,以现有的Web服务项目并添加控件的网页中指定的标记如下,编写JavaScript函数调用Web服务和回调方法。调用Web服务方法   是通过使用代理类和参数列表,成功回调函数名,失败的回调函数,用户方面是通过额外的参数的要求调用。   <%@ Page  Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="AjaxWebService.Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">     <title>AJAX Web Form</title>     <script type="text/javascript"> function CallNextDate()      {         AjaxWebService.Service.getNextBackupDate(1, OnSucceeded);     }     function CallHelloWorld()      {         AjaxWebService.Service.HelloWorld(OnSucceeded);     }    function CallBookTitle()      {         AjaxWebService.Service.GetBookTitle(OnSuccess, OnFail, "XmlDocument");     }          // This is the callback function that processes the Web Service return value in JSON format.    function OnSucceeded(result)     {         var myresult = document.getElementById("Text1");         myresult.value = result;     }         // This is the callback function that processes the Web Service return value in XML format.    function OnSuccess(result)     {         var myresult = document.getElementById("Text1");         myresult.value = "Title: " + result.documentElement.text;     }         // This is the callback function that processes the Web Service return value in XML format.    function OnFail(error)     {         var myresult = document.getElementById("Text1");         myresult.value = "Service Error: " + error.get_message();     }      </script>        <style type="text/css">         #Text1         {             width: 375px;         }         #Button2         {             width: 140px;         }     </style>   </head><body>     <form id="form1" runat="server">     <div>         <asp:ScriptManager ID="ScriptManager1" runat="server">         <Services>         <asp:ServiceReference Path="~/Service.asmx"/>         </Services>         </asp:ScriptManager>         <br />         Result:           <input id="Text1" type="text" /><br />         <br />         <input id="Button1" type="button" value="Get Server Time" onclick="CallNextDate()" />           <input id="Button2" type="button" value="Say Hello World" onclick="CallHelloWorld()" />           <input id="Button3" type="button" value="Get Book Title" onclick="CallBookTitle()" />              <br />         <br />         <br />         </div>     </form></body></html>         在上面的标记,通知的路径属性如何在ServiceReference元素ScriptManager控制点到Web服务类。这使得Web服务方法被称为从脚本中的default.aspx页面。内嵌功能CallNextDate , CallHelloWorld , CallBookTitle是用来调用的三个Web服务方法。 OnSuccess和OnFail方法是回调方法,得到执行的Web服务的方法得到了执行。为了使客户端的Web页的正常工作,您需要添加以下设置的Web.config文件。   <runtime>     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">       <dependentAssembly>         <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>         <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>       </dependentAssembly>       <dependentAssembly>         <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>         <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>       </dependentAssembly>     </assemblyBinding>   </runtime>          本文使用微软ASP.NET 3.5引用的System.Web.Extensions.dll等DLL,利用内置的ASP.NET3.5中的AJAX技术仅供学习人员参考。  参考代码下载   本文转自 高阳 51CTO博客,原文链接:http://blog.51cto.com/xiaoyinnet/196073 ,如需转载请自行联系原作者
文章
JavaScript  ·  前端开发  ·  .NET  ·  数据格式  ·  开发框架  ·  JSON  ·  XML  ·  C#  ·  网络架构
2017-11-17
使用ASP.Net 3.5 的Ajax与Web服务开发实例
本文继续介绍使用ASP.NET3.5中的AJAX环境中如何从客户端JavaScript调用Web服务方法。编写本文的目的在于让大家深刻了解基于ASP.Net3.5的Ajax和Web的服务,虽然例子比较简单,但是比较能说明问题。在这里我又介绍了命名空间System. Web.Script的方式确定客户端调用Web服务方法。        在AJAX中调用Web服务方法可以提高Web用户的体验,微软在ASP.NET3.5中的AJAX加入了它的新功能,新的功能可以从客户端JavaScript调用Web服务方法无刷新整个页面。AJAX技术使你能够调用服务器端的方法,没有post back。客户端脚本可以提出请求的Web方法,并可以通过数据作为输入参数的方法和数据也可以从服务器发回给客户端浏览器。         为了使你的应用程序调用的ASP.NET Web service使用客户端脚本,服务器异步通信层会自动生成的JavaScript代理类。代理类生成为每个Web服务的   一个<asp:ServiceReference>元素被列入<asp:ScriptManager>控制的页面。  <asp:ScriptManager runat="server" ID="scriptManagerId">      <Services>             <asp:ServiceReference  Path="WebService.asmx" />      </Services></asp:ScriptManager>      这是下载的代理类的浏览器在网页加载时间,并提供了一个客户端对象,代理调用方法的Web服务。在调用相应的方法所产生的JavaScript的代理类。该代理类打开通信与网络服务。这些请求通过的XMLHTTP对象的浏览器异步通讯。          如下图所示,详细规定了不同的层上的客户机和服务器方面通讯框架。         <asp:ScriptReference>元素指定注册一个JavaScript文件,用来在网页中。只有在注册CallWebServiceMethod.js文件,您才可以在方法上进行调用,调用Web服务方法的脚本是异步的。获得返回值或以确定何时返回的请求,您必须提供一个成功的回调函数。回调函数被调用时,请求已成功完成,并且它包含的返回值(如果有的话)从Web方法调用。您也可以提供一个失败的回调函数来处理错误。此外,您还可以通过用户的背景资料,使用中的回调函数。 如下图,是WCF和Ajax调用Web service时序图。       在上一篇文章(基于ASP.NET 3.5 Web Service 的JSON扩展应用)中已经讲过,JSON - JavaScript对象符号是默认序列化格式,使用它进行数据转换之间客户端服务器请求。您可以禁用所有目前启用的协议像HTTP-GET、HTTP-POST,甚至的XML格式的SOAP中使用的早期形式的Web服务。以下设置在Web.config文件同样也是这样使用。 <system.web>     <webServices>         <protocols>           <clear/>         </protocols>       </webServices></system.web>         请求一个Web服务方法通过这些层面。你可以看到如何使用一种方法,要求在一个可用的代理对象和Web请求中,并由一个XMLHttp对象在客户端浏览器端运行。在服务器端,你的要求是与往常一样是由一个HTTP处理程序,发出的XML/JSON序列化。   如下图所示,asp.net 3.5调用Ajax与Web服务的类关系图。                                                     在AJAX中使用Web服务方法包括两个步骤:第一步是,创建和定义Web服务。第二个步,是使用客户端脚本来从一个网页的服务通话方法。创建一个Web服务: 在System.Web.Scripts.Services命名空间,你可能会发现一个属性类“ScriptSrvice ”,这需要适用于Web服务类,使Web服务方法可以调用来自客户端的脚本。这将使代理生成脚本来生成一个代理对象对应于Web服务类。           同样,在相同的命名空间,可能会发现另一个属性类“ScriptMethod”,如果采用此属性为Web方法,你可以指定哪些HTTP动词是用来调用一个方法和响应形式。此属性有三个参数描述如下:           UseHttpGet :如果设置为true,将调用该方法使用HTTP GET命令。默认值为false 。       ResponseFormat :指定是否反应将序列化的简JSON或XML 。默认值为JSON。       XmlSerializeString :指定是否所有返回类型,包括字符串类型,是为XML序列化的值将被忽略XmlSerializeString连续的响应来系列化的JSON 。         现在,创建新的Web使用ASP.NET Web Service模板在Microsoft Visual Studio 2008和修改Web服务类如下: using System.Web.Script.Services;namespace AjaxWebService {     [WebService(Namespace = "http://localhost:1382/AjaxWebService/")]     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]     [ScriptService]     public class Service : System.Web.Services.WebService     {         string myXmlData = @"<?xml version=""1.0"" encoding=""utf-8"" ?>                 <Book>                     <Title>Programming ASP.NET 3.5, AJAX and Web Services</Title>                 </Book>";                 /// <summary>         /// This method uses JSON response formatting          /// </summary>         /// <param name="months"></param>         /// <returns></returns>        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]         [WebMethod]         public string getNextBackupDate(int months)         {             return DateTime.Now.AddMonths(months).ToShortDateString();         }                  /// <summary>         /// This method uses XML response formatting         /// </summary>         /// <returns></returns>        [ScriptMethod(ResponseFormat = ResponseFormat.Xml)]         [WebMethod]         public XmlDocument GetBookTitle()         {             XmlDocument xmlDoc = new XmlDocument();             xmlDoc.LoadXml(myXmlData);             return xmlDoc;         }                 /// <summary>         /// This method uses HTTP-GET protocol to call it         /// </summary>         /// <returns></returns>        [ScriptMethod(UseHttpGet = true)]         [WebMethod]         public string HelloWorld()         {             return "Hello, world";         }     } }    注:Web服务创建的ScriptService使用如上将不会被浏览器默认。您需要修改文件中的设置Web.config文件如下,以测试上述Web服务。 <webServices>      <protocols>        <add name="HttpGet"/>         <add name="HttpPost"/>     </protocols></webServices>         调用Web服务方法使用客户端脚本,Asp.Net Web服务方法可以说是从客户端脚本异步不回传,并没有刷新整个页面。只有其之间传输数据的服务器和客户端的浏览器。 目前,.NET 3.5框架支持Web服务和客户端的网页可以在相同的域(同一网站)。   现在增加一个新的“Ajax激活Web页” ,以现有的Web服务项目并添加控件的网页中指定的标记如下,编写JavaScript函数调用Web服务和回调方法。调用Web服务方法   是通过使用代理类和参数列表,成功回调函数名,失败的回调函数,用户方面是通过额外的参数的要求调用。   <%@ Page  Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="AjaxWebService.Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">     <title>AJAX Web Form</title>     <script type="text/javascript"> function CallNextDate()      {         AjaxWebService.Service.getNextBackupDate(1, OnSucceeded);     }     function CallHelloWorld()      {         AjaxWebService.Service.HelloWorld(OnSucceeded);     }    function CallBookTitle()      {         AjaxWebService.Service.GetBookTitle(OnSuccess, OnFail, "XmlDocument");     }          // This is the callback function that processes the Web Service return value in JSON format.    function OnSucceeded(result)     {         var myresult = document.getElementById("Text1");         myresult.value = result;     }         // This is the callback function that processes the Web Service return value in XML format.    function OnSuccess(result)     {         var myresult = document.getElementById("Text1");         myresult.value = "Title: " + result.documentElement.text;     }         // This is the callback function that processes the Web Service return value in XML format.    function OnFail(error)     {         var myresult = document.getElementById("Text1");         myresult.value = "Service Error: " + error.get_message();     }      </script>        <style type="text/css">         #Text1         {             width: 375px;         }         #Button2         {             width: 140px;         }     </style>   </head><body>     <form id="form1" runat="server">     <div>         <asp:ScriptManager ID="ScriptManager1" runat="server">         <Services>         <asp:ServiceReference Path="~/Service.asmx"/>         </Services>         </asp:ScriptManager>         <br />         Result:           <input id="Text1" type="text" /><br />         <br />         <input id="Button1" type="button" value="Get Server Time" onclick="CallNextDate()" />           <input id="Button2" type="button" value="Say Hello World" onclick="CallHelloWorld()" />           <input id="Button3" type="button" value="Get Book Title" onclick="CallBookTitle()" />              <br />         <br />         <br />         </div>     </form></body></html>         在上面的标记,通知的路径属性如何在ServiceReference元素ScriptManager控制点到Web服务类。这使得Web服务方法被称为从脚本中的default.aspx页面。内嵌功能CallNextDate , CallHelloWorld , CallBookTitle是用来调用的三个Web服务方法。 OnSuccess和OnFail方法是回调方法,得到执行的Web服务的方法得到了执行。为了使客户端的Web页的正常工作,您需要添加以下设置的Web.config文件。   <runtime>     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">       <dependentAssembly>         <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>         <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>       </dependentAssembly>       <dependentAssembly>         <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>         <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>       </dependentAssembly>     </assemblyBinding>   </runtime>          本文使用微软ASP.NET 3.5引用的System.Web.Extensions.dll等DLL,利用内置的ASP.NET3.5中的AJAX技术仅供学习人员参考。  参考代码下载   本文转自高阳 51CTO博客,原文链接:http://blog.51cto.com/xiaoyinnet/196073 ,如需转载请自行联系原作者
文章
JavaScript  ·  前端开发  ·  .NET  ·  数据格式  ·  开发框架  ·  JSON  ·  XML  ·  C#  ·  网络架构
2017-11-15
使用ASP.Net 3.5 的Ajax与Web服务开发实例
本文继续介绍使用ASP.NET3.5中的AJAX环境中如何从客户端JavaScript调用Web服务方法。编写本文的目的在于让大家深刻了解基于ASP.Net3.5的Ajax和Web的服务,虽然例子比较简单,但是比较能说明问题。在这里我又介绍了命名空间System. Web.Script的方式确定客户端调用Web服务方法。        在AJAX中调用Web服务方法可以提高Web用户的体验,微软在ASP.NET3.5中的AJAX加入了它的新功能,新的功能可以从客户端JavaScript调用Web服务方法无刷新整个页面。AJAX技术使你能够调用服务器端的方法,没有post back。客户端脚本可以提出请求的Web方法,并可以通过数据作为输入参数的方法和数据也可以从服务器发回给客户端浏览器。         为了使你的应用程序调用的ASP.NET Web service使用客户端脚本,服务器异步通信层会自动生成的JavaScript代理类。代理类生成为每个Web服务的   一个<asp:ServiceReference>元素被列入<asp:ScriptManager>控制的页面。  <asp:ScriptManager runat="server" ID="scriptManagerId">      <Services>             <asp:ServiceReference  Path="WebService.asmx" />      </Services></asp:ScriptManager>      这是下载的代理类的浏览器在网页加载时间,并提供了一个客户端对象,代理调用方法的Web服务。在调用相应的方法所产生的JavaScript的代理类。该代理类打开通信与网络服务。这些请求通过的XMLHTTP对象的浏览器异步通讯。          如下图所示,详细规定了不同的层上的客户机和服务器方面通讯框架。         <asp:ScriptReference>元素指定注册一个JavaScript文件,用来在网页中。只有在注册CallWebServiceMethod.js文件,您才可以在方法上进行调用,调用Web服务方法的脚本是异步的。获得返回值或以确定何时返回的请求,您必须提供一个成功的回调函数。回调函数被调用时,请求已成功完成,并且它包含的返回值(如果有的话)从Web方法调用。您也可以提供一个失败的回调函数来处理错误。此外,您还可以通过用户的背景资料,使用中的回调函数。 如下图,是WCF和Ajax调用Web service时序图。       在上一篇文章(基于ASP.NET 3.5 Web Service 的JSON扩展应用)中已经讲过,JSON - JavaScript对象符号是默认序列化格式,使用它进行数据转换之间客户端服务器请求。您可以禁用所有目前启用的协议像HTTP-GET、HTTP-POST,甚至的XML格式的SOAP中使用的早期形式的Web服务。以下设置在Web.config文件同样也是这样使用。 <system.web>     <webServices>         <protocols>           <clear/>         </protocols>       </webServices></system.web>         请求一个Web服务方法通过这些层面。你可以看到如何使用一种方法,要求在一个可用的代理对象和Web请求中,并由一个XMLHttp对象在客户端浏览器端运行。在服务器端,你的要求是与往常一样是由一个HTTP处理程序,发出的XML/JSON序列化。   如下图所示,asp.net 3.5调用Ajax与Web服务的类关系图。                                                     在AJAX中使用Web服务方法包括两个步骤:第一步是,创建和定义Web服务。第二个步,是使用客户端脚本来从一个网页的服务通话方法。创建一个Web服务: 在System.Web.Scripts.Services命名空间,你可能会发现一个属性类“ScriptSrvice ”,这需要适用于Web服务类,使Web服务方法可以调用来自客户端的脚本。这将使代理生成脚本来生成一个代理对象对应于Web服务类。           同样,在相同的命名空间,可能会发现另一个属性类“ScriptMethod”,如果采用此属性为Web方法,你可以指定哪些HTTP动词是用来调用一个方法和响应形式。此属性有三个参数描述如下:           UseHttpGet :如果设置为true,将调用该方法使用HTTP GET命令。默认值为false 。       ResponseFormat :指定是否反应将序列化的简JSON或XML 。默认值为JSON。       XmlSerializeString :指定是否所有返回类型,包括字符串类型,是为XML序列化的值将被忽略XmlSerializeString连续的响应来系列化的JSON 。         现在,创建新的Web使用ASP.NET Web Service模板在Microsoft Visual Studio 2008和修改Web服务类如下: using System.Web.Script.Services;namespace AjaxWebService {     [WebService(Namespace = "http://localhost:1382/AjaxWebService/")]     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]     [ScriptService]     public class Service : System.Web.Services.WebService     {         string myXmlData = @"<?xml version=""1.0"" encoding=""utf-8"" ?>                 <Book>                     <Title>Programming ASP.NET 3.5, AJAX and Web Services</Title>                 </Book>";                 /// <summary>         /// This method uses JSON response formatting          /// </summary>         /// <param name="months"></param>         /// <returns></returns>        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]         [WebMethod]         public string getNextBackupDate(int months)         {             return DateTime.Now.AddMonths(months).ToShortDateString();         }                  /// <summary>         /// This method uses XML response formatting         /// </summary>         /// <returns></returns>        [ScriptMethod(ResponseFormat = ResponseFormat.Xml)]         [WebMethod]         public XmlDocument GetBookTitle()         {             XmlDocument xmlDoc = new XmlDocument();             xmlDoc.LoadXml(myXmlData);             return xmlDoc;         }                 /// <summary>         /// This method uses HTTP-GET protocol to call it         /// </summary>         /// <returns></returns>        [ScriptMethod(UseHttpGet = true)]         [WebMethod]         public string HelloWorld()         {             return "Hello, world";         }     } }    注:Web服务创建的ScriptService使用如上将不会被浏览器默认。您需要修改文件中的设置Web.config文件如下,以测试上述Web服务。 <webServices>      <protocols>        <add name="HttpGet"/>         <add name="HttpPost"/>     </protocols></webServices>         调用Web服务方法使用客户端脚本,Asp.Net Web服务方法可以说是从客户端脚本异步不回传,并没有刷新整个页面。只有其之间传输数据的服务器和客户端的浏览器。 目前,.NET 3.5框架支持Web服务和客户端的网页可以在相同的域(同一网站)。   现在增加一个新的“Ajax激活Web页” ,以现有的Web服务项目并添加控件的网页中指定的标记如下,编写JavaScript函数调用Web服务和回调方法。调用Web服务方法   是通过使用代理类和参数列表,成功回调函数名,失败的回调函数,用户方面是通过额外的参数的要求调用。   <%@ Page  Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="AjaxWebService.Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">     <title>AJAX Web Form</title>     <script type="text/javascript"> function CallNextDate()      {         AjaxWebService.Service.getNextBackupDate(1, OnSucceeded);     }     function CallHelloWorld()      {         AjaxWebService.Service.HelloWorld(OnSucceeded);     }    function CallBookTitle()      {         AjaxWebService.Service.GetBookTitle(OnSuccess, OnFail, "XmlDocument");     }          // This is the callback function that processes the Web Service return value in JSON format.    function OnSucceeded(result)     {         var myresult = document.getElementById("Text1");         myresult.value = result;     }         // This is the callback function that processes the Web Service return value in XML format.    function OnSuccess(result)     {         var myresult = document.getElementById("Text1");         myresult.value = "Title: " + result.documentElement.text;     }         // This is the callback function that processes the Web Service return value in XML format.    function OnFail(error)     {         var myresult = document.getElementById("Text1");         myresult.value = "Service Error: " + error.get_message();     }      </script>        <style type="text/css">         #Text1         {             width: 375px;         }         #Button2         {             width: 140px;         }     </style>   </head><body>     <form id="form1" runat="server">     <div>         <asp:ScriptManager ID="ScriptManager1" runat="server">         <Services>         <asp:ServiceReference Path="~/Service.asmx"/>         </Services>         </asp:ScriptManager>         <br />         Result:           <input id="Text1" type="text" /><br />         <br />         <input id="Button1" type="button" value="Get Server Time" onclick="CallNextDate()" />           <input id="Button2" type="button" value="Say Hello World" onclick="CallHelloWorld()" />           <input id="Button3" type="button" value="Get Book Title" onclick="CallBookTitle()" />              <br />         <br />         <br />         </div>     </form></body></html>         在上面的标记,通知的路径属性如何在ServiceReference元素ScriptManager控制点到Web服务类。这使得Web服务方法被称为从脚本中的default.aspx页面。内嵌功能CallNextDate , CallHelloWorld , CallBookTitle是用来调用的三个Web服务方法。 OnSuccess和OnFail方法是回调方法,得到执行的Web服务的方法得到了执行。为了使客户端的Web页的正常工作,您需要添加以下设置的Web.config文件。   <runtime>     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">       <dependentAssembly>         <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>         <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>       </dependentAssembly>       <dependentAssembly>         <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>         <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>       </dependentAssembly>     </assemblyBinding>   </runtime>          本文使用微软ASP.NET 3.5引用的System.Web.Extensions.dll等DLL,利用内置的ASP.NET3.5中的AJAX技术仅供学习人员参考。  参考代码下载   本文转自 高阳 51CTO博客,原文链接:http://blog.51cto.com/xiaoyinnet/196073,如需转载请自行联系原作者
文章
JavaScript  ·  前端开发  ·  .NET  ·  数据格式  ·  开发框架  ·  JSON  ·  XML  ·  C#  ·  网络架构
2017-11-15
100道C#面试题(.net开发人员必备)
100道C#面试题(.net开发人员必备) 注明:经过本人面试的经历和在网上的资料整理出来的100道比较常见的C#面试题,想当初面试公司虽然不是很多,第一次找工作用了近两周的时间面试了二十多家公司,成功的不到十家,最后选择了一家大型的软件公司干了两个月就走人了。后来又找了一周工作,面试了十一家公司,成功9家。现在已经在公司工作了快两年的时间了。以下的面试题也是自己曾经做过的,希望能帮助更多的同行找到满意的工作!!! 1. .NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。 C#是一种编程语言,可以基于.NET平台的应用。 2.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现。 答:public class MainClass { public static void Main() { Console.WriteLine(Foo(30)); } public static int Foo(int i) { if (i <= 0) return 0; else if(i > 0 && i <= 2) return 1; else return Foo(i -1) + Foo(i - 2); } } 3. C#中的委托是什么?事件是不是一种委托? 答 : 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的引用。 是,是一种特殊的委托 4. 简述 private、 protected、 public、internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected: 保护成员,该类内部和继承类中可以访问。 public: 公共成员,完全公开,没有访问限制。 internal:在同一命名空间内可以访问。 5. override与重载的区别 答 :override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多 次重载以适应不同的需要 Override是进行基类中函数的重写。为了适应需要。 6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 :   this.Server.Transfer 7. 请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? 答: foreach (System.Windows.Forms.Control control in this.Controls) { if (control is System.Windows.Forms.TextBox) { System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; tb.Text = String.Empty ; } } 8. 请编程实现一个冒泡排序算法? 答: int [] array = new int [*] ; int temp = 0 ; for (int i = 0 ; i < array.Length - 1 ; i++) { for (int j = i + 1 ; j < array.Length ; j++) { if (array[j] < array[i]) { temp = array[i] ; array[i] = array[j] ; array[j] = temp ; } } } 9. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。 10. 求以下表达式的值,写出您想到的一种或几种实现方法:1-2+3-4+……+m 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i < Num + 1 ; i++) { if((i%2) == 1) { Sum += i ; } else { Sum = Sum - I ; } } System.Console.WriteLine(Sum.ToString()); System.Console.ReadLine() ; 11. 在下面的例子里 using System; class A { public A() { PrintFields(); } public virtual void PrintFields(){} } class B:A { int x=1; int y; public B() { y=-1; } public override void PrintFields() { Console.WriteLine("x={0},y={1}",x,y); } 当使用new B()创建B的实例时,产生什么输出? 答:X=1,Y=0;x= 1 y = -1 12. CTS、CLS、CLR分别作何解释? 答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。 13. 什么是装箱和拆箱? 答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。 14. 什么是受管制的代码? 答:unsafe:非托管代码。不经过CLR运行。 15.什么是强类型系统? 答:RTTI:类型识别系统。 16.net中读写数据库需要用到那些类?他们的作用? 答:DataSet:数据存储器。 DataCommand:执行语句命令。 DataAdapter:数据的集合,用语填充。 17.列举ASP.NET页面之间传递值的几种方式。 答. 1).使用QueryString, 如....?id=1; response. Redirect().... 2).使用Session变量 3).使用Server.Transfer 18.什么是Code-Behind技术? 答:代码后植。 19.在.net中,配件的意思是? 答:程序集。(中间语言,源数据,资源,装配清单) 20.常用的调用WebService的方法有哪些? 答:1.使用WSDL.exe命令行工具。 2.使用VS.NET中的Add Web Reference菜单选项 21..netRemoting 的工作原理是什么? 答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置 。 22.在C#中,string str = null 与 string str = “” 请尽量使用文字或图 象说明其中的区别。 答:string str = null 是不给他分配内存空间,而string str = "" 给它分配 长度为空字符串的内存空间。 23.请详述在dotnet中类(class)与结构(struct)的异同? 答:Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类 型,是分配在内存的栈上的. 24.分析以下代码,完成填空 stringstrTmp = "abcdefg某某某"; inti= System.Text.Encoding.Default.GetBytes(strTmp).Length; intj= strTmp.Length; 以上代码执行完后,i= j= 答:i=13,j=10 25.SQLSERVER服务器中,给定表table1 中有两个字段 ID、LastUpdateDate, ID表示更新的事务号,LastUpdateDate表示更新时的服务器时间,请使用一句 SQL语句获得最后更新的事务号 答:Select ID FROM table1 Where LastUpdateDate = (Select MAX (LastUpdateDate)FROM table1) 26.简要谈一下您对微软.NET构架下remoting和webservice两项技术的理解以及 实际中的应用。 答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传 送提高效率。 27.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到 以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视 图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的 思路 答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中。   28.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID 作为主键,注意:ID可能不是连续的。 答:解1: select top 10 * from A where id not in (select top 30 id fromA) 解2: select top 10 * from A where id >(select max(id) from (select top30 id from A )as A) 29.面向对象的语言具有________性、_________性、________性 答:封装、继承、多态。 30.能用foreach遍历访问的对象需要实现 ________________接口或声明 ________________方法的类型。 答:IEnumerable 、 GetEnumerator。 31.GC是什么? 为什么要有GC? 答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管 理。要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc() 32.Strings = new String("xyz");创建了几个String Object? 答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。   33.启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状 态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run() 方法可以产生必须退出的标志来停止一个线程。 34.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可 继承实体类(concrete class)? 答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承 实体类,但前提是实体类必须有明确的构造函数。 35.构造器Constructor是否可被override? 答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载 Overloading。 36.是否可以继承String类? 答:String类是final类故不可以继承。 37.try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会 不会被执行,什么时候被执行,在return前还是后? 答:会执行,在return前执行。 38.两个对象值相同(x.equals(y)== true),但却可有不同的hash code,这句 话对不对? 答:不对,有相同的hash code。 39.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? 答:switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case语句的参数应该是 int、 short、 char 或者 byte。long,string 都不 能作用于swtich。 40.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此 对象的其它方法? 不能,一个对象的一个synchronized方法只能由一个线程访问。 41.abstract的method是否可同时是static,是否可同时是native,是否可同时是 synchronized? 答:都不能。 42.List,Set, Map是否继承自Collection接口? 答:List,Set是Map不是 43.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()?它们有何区别? 答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。 equals()是判读两个Set是否相等。 equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是 当两个分离的对象的内容和类型相配的话,返回真值。 44.数组有没有length()这个方法? String有没有length()这个方法? 答:数组没有length()这个方法,有length的属性。String有有length()这个方 法。 45.sleep()和 wait() 有什么区别? 答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程 不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被 调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。 wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程 会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 46.shorts1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错 ? 答:short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式 转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正 确。 47.谈谈final,finally, finalize的区别。 答: final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新 的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被 声明为final的。将变量或方法声明为final,可以保证它们在使用中 不被改变。 被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可 修改。被声明为 final的方法也同样只能使用,不能重载 finally—再异常处理时提供finally 块来执行任何清除操作。如果抛出一个异 常,那么相匹配的 catch 子句就会 执行,然后控制就会进入 finally 块(如果 有的话)。 finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象 从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个 对象没有被引用时对这个对象调用的。它是在 Object 类中定义的 ,因此所有的 类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工 作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 48.如何处理几十万条并发数据? 答:用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方 式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来 获取. 49.Session有什么重大BUG,微软提出了什么方法加以解决? 答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法 捕获Session的END事件。 50.进程和线程的区别? 答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个 进程可以有多个线程,这些线程共享这个进程的资源。 51.堆和栈的区别? 答: 栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。 堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆 上。 52.成员变量和成员函数前加static的作用? 答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分 别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数 负责这种统计的动作。 53.ASP。NET与ASP相比,主要有哪些进步? 答:asp解释形,aspx编译型,性能提高,有利于保护源码。 54.请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。 答:session(viewstate) 简单,但易丢失 application全局 cookie简单,但可能不支持,可能被伪造 inputttype="hidden" 简单,可能被伪造 url参数 简单,显示于地址栏,长度有限 数据库 稳定,安全,但性能相对弱 55.请指出GAC的含义? 答:全局程序集缓存。 56.向服务器发送请求有几种方式? 答:get,post。get一般为链接方式,post一般为按钮方式。 57.DataReader与Dataset有什么区别? 答:一个是只能向前的只读游标,一个是内存中虚拟的数据库。 58.软件开发过程一般有几个阶段?每个阶段的作用? 答:需求分析,架构设计,代码编写,QA,部署 59.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法。 答:using 引入名称空间或者使用非托管资源 new新建实例或者隐藏父类方法 60.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中 间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空 格数不可超过一个. 答:string inputStr=" xx xx "; inputStr=Regex.Replace(inputStr.Trim(),"*"," ");   61.什么叫做SQL注入,如何防止?请举例说明。 答:利用sql关键字对网站进行攻击。过滤关键字'等 62.什么是反射? 答:动态获取程序集信息 63.用Singleton如何写设计模式 答:static属性里面new ,构造函数private 64.什么是ApplicationPool? 答:Web应用,类似Thread Pool,提高并发性能。 65.什么是虚函数?什么是抽象函数? 答:虚函数:没有实现的,可由子类继承并重写的函数。抽象函数:规定其非虚 子类必须实现的函数,必须被重写。 66.什么是XML? 答:XML即可扩展标记语言。eXtensible Markup Language.标记是指计算机所能 理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。 如何定义这些标记,即可以选择国际通用的标记语言,比如HTML,也可以使用象 XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML 中简化修改出来的。它主要用到的有XML、XSL和XPath等。 67.什么是WebService?UDDI? 答:Web Service便是基于网络的、分布式的模块化组件,它执行特定的任务,遵 守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。 UDDI的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为 WebService提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将 自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。 68.什么是ASP.net中的用户控件? 答:用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类 似ASP中的include..但是功能要强大的多。 69.列举一下你所了解的XML技术及其应用 答:xml用于配置,用于保存静态数据类型.接触XML最多的是web Services..和 config 70.ADO.net中常用的对象有哪些?分别描述一下。 答:Connection 数据库连接对象 Command数据库命令 DataReader数据读取器 DataSet数据集 71.什么是code-Behind技术。 答:ASPX,RESX和CS三个后缀的文件,这个就是代码分离.实现了HTML代码和服务 器代码分离.方便代码编写和整理. 72.什么是SOAP,有哪些应用。 答:simple object access protocal,简单对象接受协议.以xml为基本编码结构 ,建立在已有通信协议上(如http,不过据说ms在搞最底层的架构在tcp/ip上的 soap)的一种规范WebService使用的协议.. 73.C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处 在哪里? 答:一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加 性质 74.XML与 HTML 的主要区别 答:1. XML是区分大小写字母的,HTML不区分。 2.在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以 省略</p>或者</li>之类的结束标记。在XML中,绝对不能省略掉结束标记。 3.在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为 结尾。这样分析器就知道不用查找结束标记了。 4.在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。 5.在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应 的值。 75.c#中的三元运算符是? 答:?:。 76.当整数a赋值给一个object对象时,整数a将会被? 答:装箱。 77.类成员有_____种可访问形式? 答:this.;new Class().Method; 78.publicstatic const int A=1;这段代码有错误么?是什么? 答:const不能用static修饰。 79.floatf=-123.567F; int i=(int)f;i的值现在是_____? 答:-123。 80.委托声明的关键字是______? 答:delegate. 81.用sealed修饰的类有什么特点? 答:密封,不能继承。 82.在Asp.net中所有的自定义用户控件都必须继承自________? 答:Control。 83.在.Net中所有可序列化的类都被标记为_____? 答:[serializable] 84.在.Net托管代码中我们不用担心内存漏洞,这是因为有了______? 答:GC。 85.当类T只声明了私有实例构造函数时,则在T的程序文本外部,___可以___(可 以 or 不可以)从T派生出新的类,不可以____(可以 or 不可以)直接创建T的 任何实例。 答:不可以,不可以。 86.下面这段代码有错误么? switch(i){ case():答://case()条件不能为空 CaseZero(); break; case1: CaseOne(); break; case2: dufault;答://wrong,格式不正确 CaseTwo(); break; } 87.在.Net中,类System.Web.UI.Page 可以被继承么? 答:可以。 88..net的错误处理机制是什么? 答:.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛 ,直到找到匹配的Catch为止。 89.利用operator声明且仅声明了==,有什么错误么? 答:要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!=" 90.在.net(C# or vb.net)中如何取消一个窗体的关闭。 答:private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgse) { e.Cancel=true; } 91.在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close有什么 不同? 答:一个是退出整个应用程序,一个是关闭其中一个form。   92.某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密 码单词必须遵循如下规则: (1) 密码单词的最小长度是两个字母,可以相同,也可以不同 (2) K不可能是单词的第一个字母 (3) 如果L出现,则出现次数不止一次 (4) M不能使最后一个也不能是倒数第二个字母 (5) K出现,则N就一定出现 (6) O如果是最后一个字母,则L一定出现 问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词? A)K B)L C) M D) N 答案:B 问题二:如果能得到的字母是K、L、M,那么能够形成的两个字母长的密码单词的 总数是多少? A)1个 B)3个 C)6个 D)9个 答案:A 问题三:下列哪一个是单词密码? A)KLLN B) LOML C) MLLO D)NMKO 答案:C 93.62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等 式成立,如何移动? 答案:62移动成2的6次方 94.C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好 处在哪里? 答:attribute:自定义属性的基类;property :类中的属性 95.在C#中,string str = null 与 string str = "" 请尽量使用文字或图 象说明其中的区别。 答:null是没有空间引用的; "" 是空间为0的字符串; 96.abstract class和interface有什么区别? 答:声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 97.<%# %> 和 <% %> 有什么区别? 答:<%# %>表示绑定的数据源 <%%>是服务器端代码块 98.重载与覆盖的区别? 答:1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个 类中方法之间的关系,是水平关系 2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之 间的关系。 99.Overloaded的方法是否可以改变返回值的类型? 答:Overloaded的方法是可以改变返回值的类型。 100.C#可否对内存进行直接的操作? 答:在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员不过在C#中。  原文地址http://www.bieryun.com/795.html
文章
XML  ·  .NET  ·  Java  ·  C#  ·  数据格式
2018-02-01
跳转至:
开发与运维
5766 人关注 | 133244 讨论 | 318453 内容
+ 订阅
  • 【滤波器】基于Matlab实现直接型、级联型、并联型IIR滤波器
  • 私有化部署 Outline
  • OpenSupports 在 NGINX 下的配置
查看更多 >
大数据
188703 人关注 | 30735 讨论 | 83737 内容
+ 订阅
  • 【滤波器】基于Matlab实现直接型、级联型、并联型IIR滤波器
  • 【大数据开发运维解决方案】记一次同事不慎用root起动weblogic以及启动日志卡在The server started in RUNNING mode 问题解决过程
  • 【大数据开发运维解决方案】ogg(GoldenGate)三大进程常用参数
查看更多 >
数据库
252936 人关注 | 52042 讨论 | 98853 内容
+ 订阅
  • 私有化部署 Outline
  • OpenSupports 在 NGINX 下的配置
  • 【大数据开发运维解决方案】记一次同事不慎用root起动weblogic以及启动日志卡在The server started in RUNNING mode 问题解决过程
查看更多 >
微服务
23043 人关注 | 11685 讨论 | 35023 内容
+ 订阅
  • 【大数据开发运维解决方案】hadoop+kylin安装及官方cube/steam cube案例文档
  • 【大数据开发运维解决方案】Kylin消费Kafka数据流式构建cube
  • 【大数据开发运维解决方案】Hadoop2.7.6+Spark2.4.4+Scala2.11.12+Hudi0.5.2单机伪分布式安装
查看更多 >