ASP.NET和Web服务
Web服务概述
1、Web服务的演变
– PC机的出现:第一次计算机革命
– Web的问世:进入了全球网络和信息时代。当网络只是一个提供信息、交流信息、使用信息的平台。没有成为计算平台。
• 主机/终端-客户端/服务器-中间件-分布式组件
• Java技术的出现:跨平台
• XML:不同系统之间的数据交换
–Web服务:提供了一种软件组件生产和流通的技术和标准。“软件就是服务”的真正实现
web服务的三基石
• 简单对象访问协议-SOAP。是一种基于XML的通信协议。包括三个部分:
– SOAP封装结构:定义消息的XML格式,包括整体框架、消息内容、谁处理这些内容等。
– SOAP编程规则:定义如何将程序数据表示为XML。
– SOAP RPC表示:定义如何使用SOAP进行远程过程调用。
此外,SOAP规范还定义了包含SOAP消息的HTTP消息样式。
• Web服务描述语言-WSDL
– 是一个XML文档,用于说明一组SOAP消息以及如何交换这些消息
– 还定义了服务的位置以及使用服务的通信协议
– 可以提供更高层次的消息,如web服务的业务类型和关联关键字等
• 统一描述、发现和集成-UDDI
–Web服务的黄页
– 其核心组件是UDDI商业注册,它使用一个XML文档来描述Web服务。包括三个部分
• 白页:介绍提供服务的公司,包括名称、地址、联系方式
• 黄页:包括按照标准分类进行分类的行业类别
• 绿页:细则介绍、访问服务接口等技术信息
Web服务的创建和使用
• Web服务的创建
– 把类放在带有.asmx扩展名的文件中
– 添加名称空间System.Web.Services
– 把页面的顶部添加WebService指示符:
<%@WebService Language="c#" Codebehind="LoginService.asmx.cs"
Class="LoginService.LoginService" %>
– 向需要用于web服务的方法添加WebMethod属性
Web服务的使用
– 直接创建代理类
– 使用VS.NET创建代理类
代理类
• 代理类:可以引用远程的Web服务,在用户的应用程序中使用其功能,就象返回的
数据是本地生产的一样。
• 步骤
– 使用WSDL.EXE创建代理类
– 使用CSC编译生成的CS文件为DLL文件
方法一:
在VS2003/2005中的项目中,添加Web引用,这样就直接生成代理类了
方法二:
// IBookSale.cs要生成的代理类,http://localhost/IBookSale.asmx是web服务文件
wsdl /out:IBookSale.cs http://localhost/IBookSale.asmx
//把生成的代理类编译成dll文件
csc /out:regBookSale.dll /t:library /r:System.Xml.dll /r:System.Web.Service.dll IBookSale.cs
通过Web服务外置数据
.NET Framework能够通过Web服务在Internet上外置数据对象。这样的好处是:
• 允许访问其他操作系统
• 允许通过防火墙访问
• 允许开发者方便地重用代码
• 限制了对数据库的连接
• 允许用户通过编程方式访问Internet上的对象
• DataSet外置:DataSet能够用Web Service方法返回。DataSet能够在一个智能化的结
构中存储复杂的信息和关系,这是WebService的一个非常有用的方法。
• XML外置
管理Web服务的状态
• 在Web服务中的状态管理是可选的,并且默认情况下是禁用的。
• 要启用状态管理,必须
– 实现web服务的类必须从System.Web.Services名称空间的WebService类中继承
– 继承类可以自动访问Application对象
– 只有把WebMethod属性EnableSession设置为true,保存在Session中的数据才是有效的。
【代码分析】
ASP.NET2.0
服务器端:
[WebMethod]
public string ReverseStr(string str)
{
if (str == null)
return null;
int len = str.Length;
char[] arrIn = str.ToCharArray();
char[] arrOut = new char[len];
//reverse
for (int i = 0; i < len; i++)
arrOut[i] = arrIn[len - i - 1];
return new string(arrOut);
}
客户端代码:
//用于异步回调
public void reverseComplete
(object sender,FormService.CustomService.ReverseStrCompletedEventArgs e)
{
if (e.Error == null)
{
this.tbStrResult.Text=e.Result.ToString();
}
else
{
MessageBox.Show(e.Error.Message);
}
}
private void btnReverse_Click(object sender, EventArgs e)
{
string strInit = this.tbStrInit.Text.Trim().ToString();
if (strInit == null)
return;
CustomService.myWebService myWS = new FormService.CustomService.myWebService();
myWS.ReverseStrCompleted += new FormService.CustomService.ReverseStrCompletedEventHandler(reverseComplete);
myWS.ReverseStrAsync(strInit);
MessageBox.Show("异步开始");
}
ASP.NET1.0/1.1的异步回调方法看
http://blog.youkuaiyun.com/lne818/archive/2006/09/02/1159168.aspx
异步处理
同步处理
• 同步化操作:由前后紧接的组件或函数调用组成。一个同步化调用会阻塞整个进程直到这一个操作完成。
异步处理
• 异步化操作:不会阻塞启动操作的调用线程。调用程序必须通过轮流检测、软件中的中断信号或只是明确地等待完成信号来发现调用的完成。
异步Web服务
• .NET Framework为支持异步化编程模型提供了必要的服务
• 决定特定的调用是否应该异步化处理的是客户机的代码
• 不需要进行额外的编程
• CLR提供了类型安全
• 代理类提供了BeginInvoke和EndInvoke方法来支持异步处理
Web服务和事务处理
什么是事务处理?
• 事务是一组组合成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将
控制和维护每个数据库的一致性和完整性。
• 如果在事务过程中没有遇到错误,事务中的所有修改都将永久成为数据库的一部分。
• 如果遇到错误,则不会对数据库作出任何修改。
Web服务和事务处理
• 支持Web服务的事务利用公共语言运行期中的支持,其是基于Microsoft Transaction Server ( MTS)和COM+Services中相同的分布式事务模型。该模型基于明确的判断一个对象是否参与一个事务,而不是编写特定的代码用来处理委托和回调一个事务。
• 对于一个使用ASP.NET创建的XML Web服务,你可以通过设置其应用到一个XML Web服务方法上的WebMethod属性的TransactionOption属性来声明一个XML Web服务的事务行为。如果该XML Web服务方法执行的时候抛出一个异常,那么该事务自动地结束;相反,如果没有发生异常,该事务自动委托。
• [ WebMethod(TransactionOption=TransactionOption.RequiresNew)]
TransactionOption属性
Disabled(默认) | 指示XML Web services 方法不在事务的范围内运行。当处理请求时,将在没有事务的情况下执行XML Web services 方法。 |
NotSupported | 指示XML Web services 方法不在事务的范围内运行。当处理请求时,将在没有事务的情况下执行XML Web services 方法 |
Supported | 指示XML Web services 方法不在事务的范围内运行。当处理请求时,将在没有事务的情况下执行XML Web services 方法 |
Required | 指示XML Web services 方法需要事务。由于Web 服务方法只能作为根对象参与事务,因此将为Web 服务方法创建一个新事务。 |
RequiresNew | 指示XML Web services 方法需要新事务。当处理请求时,将在新事务内创建XML Web services。 |
Web服务中的缓存
• ASP.NET有两种用于WEB应用的缓冲技术:
– 输出缓冲指:把一次请求所产生的动态输出保存于内存中。
– 数据缓冲指:按照一定的策略把事先不确定的对象保存于内存中。它允许页面保存和索
引HTTP请求所要求的各种各样的对象。
• 这ASP.NET中的缓存技术在Web服务中都可以继续使用。只是使用方法有一些区别。