Webservice学习.docx
《Webservice学习.docx》由会员分享,可在线阅读,更多相关《Webservice学习.docx(27页珍藏版)》请在冰豆网上搜索。
Webservice学习
WebService学习笔记
(1)
WebService的宗旨是创建不需要用户界面就能与其他应用程序交互的Web应用程序。
举例说明它的优点,假如你正在为一家股票投资公司创建网站,你并不需要把不同证劵交易所得数据库与自己的后台数据库进行整合,因为你的应用程序可以使用WebService,并使用XML格式交换数据。
WebService是松耦合的,它与服务器端和客户端使用的操作系统、编程语言都无关。
假如你既拥有客户端又有服务器端的访问和管理权,这种情况更适合用.NET 的Remoting技术,而不是Webservice。
创建WebService必须保证的是,服务器端和客户端都要支持HTTP、SOAP(简单对象访问协议)和XML等行业标准协议。
WebService是如何工作的
WebService允许两个程序之间交换XML文档。
在这个架构的顶层,微软实现了一个远程过程调用(RemoteProcedureCall,PRC)模型。
WebService架构包括以下特性:
1。
WebServcie的服务器端和客户端应用程序都能够连接到互联网。
2。
用于进行通信的数据格式必须遵守相同的开放标准,并且在大多数情况下,这个标准几乎总是SOAP。
3。
客户端和服务器端的系统是松耦合的。
即WebService不关心客户端和服务器端所使用的操作系统、对象模型或者编程语言。
只要WebService和使用WebService的应用程序都能够发送和接收遵守适当协议标准的消息即可。
下图为WebService流程的逻辑架构
如图所示,一个WebService使用着会向WebService发出一个调用请求。
使用者会认为它通过Internet直接和WebService进行交流,当然这实际上是个幻象。
实际上,真正的调用由代理类完成。
代理类对于WebService使用者来说是一个本地类。
代理会处理所有的负责的复杂架构,包括通过Internet发送请求道服务器、从webService取回结果并呈现给WebService使用者。
由于代理类在之前已在消费程序中注册,所有一切工作才可以顺利进行。
注册有开发消费程序的程序员完成。
开发WebService
开发WebService的流程与开发网页的流程近乎一致:
1。
所有构成网页和服务的源文件都是文本文件,它们可以使用任何文本编辑器创建和修改。
而类文件可以在控制台命令行中通过命令工具进行编译。
2。
可以在vs2005及以上版本中创建网页和WebService
3。
网页和WebService既可以使用代码隐藏模型,也可以使用内联编码(inlinecoding)模型。
WebService中不需要使用代码隐藏技术,因为WebService并不包括任何可视化内容。
4。
网页和WebService都充分利用了CLR和.NETFramework。
.aspx文件用于定义网页,而.asmx文件用于定WebService,我们可以吧WebService想象成类,类中的一些方法通过Internet被暴露给客户端。
代理
客户端应用程序如果使用WebService,必须先创建一个代理。
代理是要调用的真正代码的替身,它负责在机器边界引导调用。
在代理在客户端应用程序中注册后,客户端应用程序调用方法就如调用本地对象一样。
代理接受该调用,并以适当格式封装调用,然后以SOAP请求发送调用到服务器。
当服务器返回SOAP包给客户端后,代理会对包进行解密,并且如同从本地对象的方法返回数据一样将其返回给客户端应用程序。
如下图所示:
协议与标准(HTTP、XML、SOAP)
HTTP:
TCP/IP协议的最上层是超文本传输协议(HTTP)。
它是用于在网络之间使用服务器和浏览器实现通讯,主要包括在服务器和浏览器建立连接,并将HTML传输到客户端浏览器。
当客户端向服务器发送HTTP请求后,服务器就开始处理请求。
通常,会返回HTML页面,然后通过浏览器呈现。
然而对WebService而言,服务器返回的是SOAP消息,消息中包含了被调用的WebService方法的返回数据。
HTTP请求从请求的浏览器出传递名称和值到服务器,这种请求包括GET和POST两种。
GET请求中,名称和值会被附加到url上,数据是未加密的。
当所有需要传递的数据可以使用名称和值成对表示,而且只需要传递少量字段,字段长度较短时,比较适合GET请求。
另外,如果不需考虑安全问题时,也可以使用GET。
POST请求中,配对的名称和值是作为请求消息的一部分发送的。
当有大量字段或者参数很长时,适合使用POST请求。
从安全方面看,POST比GET更安全,因为POST请求可以被加密。
和GET请求一样,POST请求无法传递复杂的数据类型(如类、结构体和DataSet)。
XML:
是有W3C公布的开放标准的一种描述数据的方法。
XML和HTML十分类似。
不同的是HTML使用的是预定义元素,这些元素规定了HTML在浏览器中如何显示,而XML的元素则是由开放人员自己定义的,所以几乎所有的数据都可以表示。
制定XML的目的是为了使其成为一种平台无关、语言无关的标准。
XML架构(Schema)是用于定义元素已经XML文档中或者许多XML之间元素与元素之间关联的文件。
在架构中将指定元素名称和内容类型。
HTML与XML的显著差别:
大多数HTML读取器有很好的容错能力,而XML读取器则完全不同,所以XML文件的格式必须正确。
另外,XML元素都是小写的。
SOAP:
(simpleobjectaccessprotocol,简单对象访问协议)是一种用于控制数据交换的XML语法。
它是简单的、轻量级的信息交换协议。
SOAP消息有消息内容和一个或多个头模块组成,并且封装在SOAPenvelope中。
SOAP使用XML语法来格式化内容。
在设计上,SOAP尽可能简单并且提供最小化的功能。
SOAP不需HTTP的GET和POST,它不受“名称/值”对的限制,我们可以使用它来发送复杂的对象,包括DataSet、类和其他对象。
SOAP的缺点:
SOAP消息十分冗长,因此如果存在带宽或者传输性能的问题,建议使用POST或GET.
WebService学习笔记
(2)
创建一个简单的WebService
上一章节中提到WebService与网页的相似之处,这里在总结下:
1。
由和通用语言运行时完全实现,包含面向对象架构,所有基类,还有一些特性,如缓存、状态和数据访问
2。
几乎一致的文件和代码结构
3。
所有源代码文件都是普通文本
4。
vs完全支持,可以使用vs十分便捷的编辑、调试
5。
使用一个基于普通文本的配置文件和vs的网站管理工具做全局或者应用程序级配置。
WebService没有界面,它只有方法,有一些事支持从客户端远程调用的。
WebService文件的后缀名为asmx。
在WebService应用程序第一次运行时,如果WebService是人工编译的,并且被放在虚拟跟目录的bin目录下,那么代码隐藏对于内联编码有性能优势,因为asmx文件在WebService运行时都会被编译成一个类。
而ASP.NET2.0在默认情况下没有这一优势,因为ASP.NET2.0把源代码放在App_Code目录下,并且在第一个使用时编译。
下面是一个实例(股票跟踪,不使用数据库,只是为了演示,故使用二维数组)
这个WebService提供两个方法:
GetName:
参数是一个StcokSymbol对象,返回一个字符串,内容是股票名称
GetPrice:
参数是一个StcokSymbol对象,返回一个数字,表示当前股票的价格
我使用的是vs2010,
首先新建一个项目(WebSite也可以),注意选择.NETFramework3.5,默认4是没有WebService选项的。
选择ASP.NETWebServiceApplication,命名为StockWebService,如图
我们可以看到,vs自动为我们生成了一些代码:
///
///SummarydescriptionforService1
///
[WebService(Namespace="http:
//tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
//ToallowthisWebServicetobecalledfromscript,usingASP.NETAJAX,uncommentthefollowingline.
//[System.Web.Script.Services.ScriptService]
publicclassService1:
System.Web.Services.WebService
{
[WebMethod]
publicstringHelloWorld()
{
return"HelloWorld";
}
}
在Service类中,有一个名为HelloWorld的模板方法,它将返回一个字符串。
这个方法使用WebMethod特性做修饰,表示该方法对WebService使用程序可用。
WebMethod特性会在后面解释。
按F5运行程序,可以看到如图所示
添加以下方法
[WebMethod]
publicdoubleGetPrice(stringstockSymbol)
{
for(inti=0;i{
if(string.Compare(stockSymbol,stocks[i,0],true)==0)
returnConvert.ToDouble(stocks[i,2]);
}
return0;
}
[WebMethod]
publicstringGetName(stringstockSymbol)
{
for(inti=0;i{
if(string.Compare(stockSymbol,stocks[i,0],true)==0)
returnstocks[i,1];
}
return"Symbolnotfound.";
}
重新运行项目,发现多了两个方法调用的入口。
WebService指令
普通的.aspx文件把Page指令作为第一行代码,而WebService则有一个WebService指令(直接在vs不能看到,可以找到文件Service1.asmx右击编辑):
<%@WebServiceLanguage="C#"CodeBehind="Service1.asmx.cs"Class="StockWebService.Service1"%>
Language:
指定WebService中使用的语言,不是必需的
Class:
指定WebService的类名称,必需的
CodeBehind:
如果这个类没有包含在WebService文件的代码中,且类没有被手工编译并放在bin子目录下,WebService指令的CodeBehind属性则用于指定实现WebService类的源代码文件的名称。
Debug:
如果设为true,将以启用调试的方式编译WebService。
默认为false
从WebService类继承
虽然是可选选项,但是它有几个优点,主要优点是可获得对ASP.NET几个常见对象的访问权:
Application对象和Session对象(状态管理)、User对象(验证Web服务器调用者的身份)、Context对象(可以访问HttpContext类中调用者请求的所有特定HTTP信息)
当然也不可不继承WebService类,可能是为了克服来自.NETFramework的限制。
通过HttpContext控制Application状态
WebService可通过HttpContext控制Application对象(也可以访问所有的ASP.NET资源)
例:
在Service1.asmx.cs中添加如下方法:
///
///setexchangeofstock
///
///
[WebMethod]
publicvoidSetStockExchange(stringexchange)
{
Application["exchange"]=exchange;
}
[WebMethod]
publicstringGetStockExchange()
{
returnApplication["exchange"].ToString();
}
WebServiceBinding特性
WebService描述语言(WebServicesDescriptionLanguage,WSDL)定义的绑定可作为.NET类访问WebService的接口。
即绑定会定义一系列操作。
一个WebService类有一个默认的绑定,它包含该类的所有Web方法,该类不存在与非默认绑定的关联。
WebServiceBinding特性用于识别非默认绑定。
WebService类可以具有多个WebServiceBinding特性,每一个都可以指定不同的绑定。
如果Name属性被忽略,那个这个特性将指定默认绑定。
属性
类型
读
写
说明
ConformsTo
WsiProfiles
╳
╳
绑定需要遵守的WS-1标准
EmitConformanceClaims
Boolean
╳
╳
如果为true,当WSDL描述时,绑定会发出遵守的声明
Location
String
╳
╳
定义绑定的位置,默认值为当前WebService的URL
Name
String
╳
╳
绑定名称
Namespace
String
╳
╳
与绑定关联的命名空间
WebMethod特性
WebService由WebService类定义的,对于WebService类而言,并不需要将所有的方法提供给WebService使用者。
对需要提供的方法,须:
1。
声明为public
2。
在方法声明之前设置WebMethod特性(即加上[WebService])
WebMethod包含一些属性,用于设定web方法的行为。
语法:
[WebMethod(PropertyName=value)],以下是一些属性的说明
BufferResponse:
默认情况下,ASP.NET在从服务器端向客户端发送响应之前,会对整个响应进行缓存。
多数情况下,这是最好的做法。
但是,如果响应非常长,那么需将它设为false类禁用缓存,如果设为false,则返回到客户端的响应时16kb的块。
默认值为true
CacheDuration:
如同网页,WebService也能够把返回到客户端的结果进行缓存(有点:
如果客户端发出的请求与由另一个客户端发出的请求完全一致是,那么服务器就返回缓存中的响应,可以改善性能)。
CacheDuration定义第一次请求之后的多少秒内,会在响应中将缓存页被发送给随后的请求。
一旦缓存过期,则发送新页面给请求。
默认值为0,即禁用结果缓存。
如果web'方法返回的数据没有改变(如:
从一小时更新一次数据库中获取数据的查询),那么就可以设置结果缓存为一个合适的时间,例如1800(30分钟)。
令一方面,如果返回的数据是动态的,那么需要设置缓存持续时间较短或干脆禁用。
如果WebService没有一个相对有限的参数范围,缓冲也不适合使用。
Description:
对web方法的描述,字符串类型
EnableSession:
默认为false。
如果设为true,web方法将启用会话状态。
如果设为ture且WebService继承自WebService类,那么会话可以使用WebService.Session。
允许会话状态为应用程序增加了额外的开销。
MessageName:
在C#类中,方法可以拥有相同的名字(重载),WebService禁止使用重载。
WebMethod特性的MessageName属性可以消除由多个相同名称造成的无法识别的问题。
它允许对每一个方法的重载使用唯一的别名。
当重载方法在SOAP消息中引用时,SOAP消息将使用MessageName而非方法的名称。
TransactionOption:
ASP.NETweb方法可以使用事务,但是仅当事件在web方法中初始化时可以使用。
TransactionOption属性用于设置web方法是否启动一个事务。
然而,因为web方法的事务必须为根对象,所有只有两个不同的行为,启用一个新对象(Required、RequiresNew)或者不启动(Disabled、NotSupported、Supported)。
如果在WebService中启用事务,需:
1。
添加System.EnterpriseServices.dll引用;2。
添加命名空间(usingSystem.EnterpriseServices;);3。
向WebMethod特性添加TransactionOption属性,并设置为Required(或RequiresNew)。
WebService学习笔记(3)
WebService特性
WebService特性(不要把它与WebMethod混淆)允许向WebService添加额外的信息。
语法:
[WebService(PropertyName=value)],如果有多个属性,可以使用逗号分隔。
下面是它的一些属性:
Description:
描述WebService
Name:
当在浏览器中测试页面时,在WebService帮助页面的最顶部会显示WebService的名称,且对所有潜在的WebService使用者可用。
默认情况下,WebService的名称是实现WebService的类的名称。
Namespace:
每个WebService都有一个XML命名空间。
XML命名空间允许你在XML文档中创建名称,这个名称是一个统一资源标识符(URI)。
WebService使用在XML中定义的WSDL文档描述。
每个WebService特性必须有一个独立的XML命名空间,这样它才能够为应用程序唯一识别。
vs创建的WebService的默认URI为http:
//tempuri.org。
通常使用唯一的名称来定义一个新的命名空间,例如公司的网站。
(这个可以不是一个有效的URL)。
数据类型
WebService可以使用任何CLR支持的数据类型作为参数或者返回值。
除了基本数据类型以为,还可以使用数组和基本类型的ArrayList。
由于数据是通过XML在WebService和客户端之间传递的,那么无论使用参数或返回值,都必须使用XMLSchema或者XSD表示。
类和结构体:
WebService能够把用户定义的类和结构体作为参数或者返回值,这里有一些需要记住的规则:
1。
所有类变量必须是基本数据类型或者基本数据类型的数组;2。
所有类变量必须是公开的或者有一个公开的实现get和set访问器的属性
DataSets:
WebService能够通过XML编码后返回任何数据,这也包括返回DataSet,这是因为ADO.NET内部使用XML来表示DataSet。
一个DataSet仅是ADO.NET数据存储中的一种可以由WebService返回的类型而已。
创建发现文档
一旦创建完成WebService,负责开发WebService使用程序的开发人员需要找到一种方法,从而能够了解服务器上有哪些WebService可用,这些WebService提供了哪些方法,这些方法和属性可接收哪些参数,以及这些Web方法返回的值是什么。
这个过程叫发现,是可选的。
如果WebService使用程序的开发者了解这些WebService文件的URL,那么就不需要实施发现动作了。
可以使用disco.exe在命令行方式下创建XML文件(即发现文档)。
打开vs命名提示符(注意不是在运行里输入cmd出来的那个命令提示符)
输入:
disco/out:
<输出目录名称>http:
//localhost:
7953/Service1.asmx
通过以下两种方法发现发现文档:
1。
通过查询字符串实现发现,即在service.asmx文件后加上?
disco,如http:
//localhost:
7953/Service1.asmx?
disco
2。
静态发现文件。
如果WebService得使用程序需要使用静态发现文件,那么WebService开发人员必须创建一个静态发现文件。
发现是一个过程,它是用来寻找那些WebService可用、WebService提供了哪些方法和属性、方法和那些参数和属性,已经web方法返回的数据类型和属性。
它是一个可选过程。
为了实现在客户端机器上,从命令行执行disco工具,并把WebService的URL作为参数传递给它,如discohttp:
//localhost:
7953/Service1.asmx,这个命令将搜索指定URL来寻找一个发现文档,并把它们保存在本地计算机的当前目录。
还有一个.wsdl文件也将在当前目录生成并保存。
也可以使用/out:
参数将输出目录改为指定的目录。
如:
disco/out:
C:
/Temp/ http:
//localhost:
7953/Service1.asmx,执行该命令会把两个文件生成到输出目录的Service1.wsdl文件中,这个文件与通过在浏览器中输入.asmx?
wsdl或者使用wsdl命令生成的wsdl是相同的。
下面是disco命令的参数说明
/d[omain]:
domain 指定连接到要求身份验证的代理服务器时要使用的域名。
/nosave 不要将发现的文档或结果(.wsdl、.xsd、.disco和.discomap文件)保存到磁盘中。
默认为保存这些文档。
/nologo 取消显示Microsoft启动标题。
/o[ut]:
directoryName 指定用于保存所发现文档的输出目录。
默认为当前目录。
/p[assword]:
password 指定当连接到要求身份验证的代理服务器时要使用的密码。
/proxy:
URL 指定用于HTTP请求的代理服务器的URL。
默认为使用系统代理设置。
/proxydomain:
domain或/pd:
domain 指定连接到要求身份验证的代理服务器时要使用的域。
/proxypassword:
password或/pp:
password 指定当连接到要求身份验证的代理服务器时要使用的密码。
/proxyusername:
username或/pu:
use