XML Web Service 开发 第1章 XML Web Service 第2章 XML Web Service 体系结构
第5章 实现一个简单的 XML Web Service 管理 ASP.NET Web 服务的状态 调试 Web 服务
创建 Web 服务项目 5.1 创建一个 Web 服务项目 演示 创建一个 Web 服务项目 Web 服务项目的组成部分
演示 创建 Web 服务项目 5.1.1 演示 创建一个 Web 服务项目
检查 Web 服务项目的组成部分 引用 System 命名空间:包含了常用的数据类型、事件、接口、属性以及异常类 System.Data 命名空间:提供对 ADO.NET 的支持,其中最重要的类是 DataSet System.Web 命名空间:提供对浏览器和服务器之间通信的支持,重要的类包括 HTTPRequest 和 HTTPResponse,其他的类支持 cookie 管理、异常处理和输出缓存等 System.Web.Services命名空间:支持 Web 服务,最重要的类是 WebService
检查 Web 服务项目的组成部分 5.1.2 Web 服务项目的组成部分 引用 System.XML命名空间:提供处理 XML 文档的类,这些类是根据 W3C 的标准开发的,支持以下标准: XML 1.0 XML 命名空间 XML 架构 XSD XPath 表达式 可扩展样式表语言传输 XSLT 文档对象模型 DOM 级别1 和 级别2 简单对象访问协议 SOAP 1.1
检查 Web 服务项目的组成部分 5.1.2 Web 服务项目的组成部分 .asmx 文件:使用 ASP.NET 开发的 Web 服务的入口文件,使用不同的访问方法可以获得不同的信息 服务帮助页面:服务帮助页面包含 Web 服务方法的访问链接以及 WSDL 链接 服务方法帮助页面:提供某一服务方法的具体信息,包括该方法支持的协议类型和请求响应的消息实例等,同时可以使用 HTTP-POST 调用该方法 服务描述页面:显示 Web 服务的 WSDL 文档 在浏览器中直接输入 URL 就可以获得: http://servername/projectname/webservicename.asmx 点击服务帮助页面的方法链接就可以获得 点击服务帮助页面的 WSDL 链接,或者访问: http://servername/projectname/webservicename.asmx?WSDL
服务帮助页面 5.1.2 Web 服务项目的组成部分
服务方法帮助页面 5.1.2 Web 服务项目的组成部分
检查 Web 服务项目的组成部分 Global.asax 文件 提供代码响应 Application 的事件和 HttpModule 类的事件 由 IIS 提供保护,外部用户无法直接访问 修改后,系统自动触发 Application_OnEnd 事件终止应用程序,使修改生效,并在收到下一个访问请求后触发 Application_OnStart 事件启动应用程序 .vsdisco 文件:提供动态发现支持,不推荐使用 AssemblyInfo (“.cs” 或“.vb”) 文件 /bin 文件夹:包含编译后的程序集文件
检查 Web 服务项目的组成部分 Web.config 文件 采用XML 格式 作用范围包括当前文件夹和所有子文件夹 运行时,将缓存 ASP.NET 的配置并提供给后续访问请求使用 ASP.NET 自动监视配置是否被修改,修改后无需重启服务器就可以使新的设置生效 易于扩展,可以添加新的配置信息 可以通过配置 IIS 保护配置文件,防止来自外部的非法访问
第5章 实现一个简单的 XML Web Service 管理 ASP.NET Web 服务的状态 调试 Web 服务
实现 Web 服务方法 公开 Web 服务方法 了解数据类型和参数列表 演示 用组件设计器创建一个类型化DataSet 演示 用 XML 设计器创建一个类型化DataSet
公开 Web 服务方法 一个普通方法对外提供为可以通过 Web 服务调用的方法必须具备两个特点 方法的访问控制符是 public 方法必须由 WebMethod 属性修饰 [WebMethod] public AccountDataSet GetAccount()
配置 WebMethod 属性的属性值 BufferResponse 获取或设置是否缓存响应消息,默认值为“true” 设置为“false”时,并不意味着不缓存响应消息,而是把数据缓存为16KB 的数据块 CacheDuration 获取或设置Web 服务方法的结果在缓存中保存的时间,单位为“秒” 该值通知 ASP.NET是否进行缓存,默认值“0”表示不缓存 [WebMethod(BufferResponse=false)] public Transactions GetTransactionHistory() { //implementation code } [WebMethod(CacheDuration=60)] public double ConvertTemperature(double dFahrenheit){ return ((dFahrenheit - 32) * 5) / 9; }
配置 WebMethod 属性的属性值 Description 提供 XML Web Service 方法的说明 ,默认值为“String.Empty” [WebMethod(Description="This method converts a temperature in degrees Fahrenheit to a temperature in degrees Celsius.")] public double ConvertTemperature(double dFahrenheit) { return ((dFahrenheit - 32) * 5) / 9; }
配置 WebMethod 属性的属性值 EnableSession 设置是否为 Web 服务方法启用会话状态,默认值为“false” MessageName 用于在传递到 Web 服务方法和从 Web 服务方法返回的数据中修改 Web 服务方法的名称,默认值为该 Web 服务方法的名称 是支持方法重载的必要属性 TransactionOption 指定 XML Web Service 方法对事务的支持情况,默认值为“TransactionOption.Disabled” [WebMethod(MessageName="AddDoubles")] public double Add(double dValueOne, double dValueTwo) { return dValueOne + dValueTwo;} [WebMethod(MessageName="AddIntegers")] public int Add(int iValueOne, int iValueTwo) { return iValueOne + iValueTwo;}
检查数据类型和参数列表 简单数据类型 整型、字符串和浮点小数被封装为 XSD 的内部类型 输入和输出参数 5.2.2 了解数据类型和参数列表 简单数据类型 整型、字符串和浮点小数被封装为 XSD 的内部类型 输入和输出参数 方法的值传递变量被定义为 WSDL 的输入消息 方法的地址传递变量和返回值被定义为 WSDL 的输出消息 可变长度参数列表 实现可变长度参数列表的 Web 服务方法和普通方法一样,不同之处在于生成代理类后,必须在方法声明中手动加入可变长度关键字
检查数据类型和参数列表 5.2.2 了解数据类型和参数列表 复杂数据类型 类和结构:由于 HTTP 协议的无状态特点,类的对象实例作为参数和返回值时仅传递对象的状态数值,而不是完整的对象信息,对象传递由序列化和反序列化技术支持 数组:同构数组无需额外操作,异构数组必须使用 XmlInclude 属性列出所有子类类型,否则在序列化时会发生异常 集合:处理方法和数组类似 数据集:无需额外操作
数组返回值代码示例 5.2.2 了解数据类型和参数列表 public class Acct { [WebMethod] 5.2.2 了解数据类型和参数列表 public class Acct { public string Description; public string Number; public string Type; public decimal Balance; public string Status; } [WebMethod] [XmlInclude(typeof(CreditCardAcct))] [XmlInclude(typeof(SavingsAcct))] [return:XmlArray("AccountList")] [return:XmlArrayItem("Account")] public Acct[] GetAllAccounts() { SavingsAcct a = new SavingsAcct(); CreditCardAcct cc = new CreditCardAcct(); // populate the accounts Acct [] sa = new Acct[2]; sa[0] = a; sa[1] = cc; return sa; } public class SavingsAcct : Acct { public decimal MinimumBalance; } public class CreditCardAcct : Acct public int PayPeriod;
数据集的处理方法 非类型化数据集:与普通集合的处理方式相同,不推荐使用 5.2.2 了解数据类型和参数列表 非类型化数据集:与普通集合的处理方式相同,不推荐使用 类型化数据集:使用 XSD 架构定义表、字段和其他元素,Visual Studio .NET 对类型化数据集的支持更加完善,创建方法包括 组件设计器,缺点 必须与 DataAdapter 对象挂钩,初始时无法直接控制 DataAdapter 的 SQL 语句改变必须作相应修改 不能实现某些 DataSet 的功能 XML 设计器,缺点 集成级别较低 .xsd 文件无法与外部数据源自动关联 要求程序员熟悉 XML 架构
演示 使用组件设计器创建类型化数据集 生成 SqlDataAdapter 使用 SqlDataAdapter 创建类型化数据集 演示 使用组件设计器创建类型化数据集 5.2.3 演示 用组件设计器创建一个类型化DataSet 生成 SqlDataAdapter 使用 SqlDataAdapter 创建类型化数据集
演示 使用 XML 设计器创建类型化数据集 向项目中添加 XML 架构 向架构中添加 XML 简单类型元素 5.2.4 演示 用 XML 设计器创建一个类型化DataSet 向项目中添加 XML 架构 向架构中添加 XML 简单类型元素 向架构中添加 XML 复杂类型元素 向项目中添加 XML 元素 生成类型化数据集类 检查生成的数据集类
第5章 实现一个简单的 XML Web Service 管理 ASP.NET Web 服务的状态 调试 Web 服务
管理 ASP.NET Web 服务的状态 应用程序状态 会话状态 5.3 管理 ASP.NET Web 服务的状态 Web 服务消费者
应用程序与会话 5.3.1 应用程序状态 第一个会话和应用程序同时启动 最后一个会话和应用程序同时结束 会话1、2、3…… …… 应用程序
应用程序状态 ASP.NET 中,可以将全局变量通过 HttpApplicationState 类存储在应用程序状态中 优点 5.3.1 应用程序状态 ASP.NET 中,可以将全局变量通过 HttpApplicationState 类存储在应用程序状态中 优点 易于实现:应用程序状态易于使用,为 ASP 开发人员所熟悉,并且与其他 .NET Framework 类一致 全局范围:应用程序状态可供应用程序中的所有页面访问,因此在应用程序状态中存储信息可能意味着只保留信息的一个副本 缺点 全局范围:在应用程序状态中存储的变量仅对于运行该应用程序的特定进程而言是全局的,并且每一应用程序进程可能具有不同的值 持久性:由于应用程序状态中存储的全局数据容易丢失,如果包含这些数据的 Web 服务器进程损坏,则会丢失这些数据 资源要求:应用程序状态需要服务器内存,可能会影响服务器的性能以及应用程序的可伸缩性
使用应用程序状态 注意事项 内存占用问题,不要把大对象保存为应用程序状态 5.3.1 应用程序状态 注意事项 内存占用问题,不要把大对象保存为应用程序状态 多线程同步问题,多个线程同时读写会导致数据破坏,默认配置为了性能优化,没有自动处理多线程同步问题 死锁问题,使用锁机制解决多线程访问冲突就必然导致发生死锁 数据容易丢失 Web 园和 Web场中不会共享应用程序状态数据
应用程序状态同步 调用 HttpApplicationState 的 Lock 和 Unlock 方法可以解决多线程应用程序状态数据同步问题 5.3.1 应用程序状态 调用 HttpApplicationState 的 Lock 和 Unlock 方法可以解决多线程应用程序状态数据同步问题 Application.Lock(); Application["SomeGlobalCounter"] = (int)Application["SomeGlobalCounter"] + 1; Application.UnLock();
会话状态 5.3.2 会话状态 ASP.NET 提供了一种会话状态,该会话状态可作为 HttpSessionState 类或存储会话特定信息(仅在该会话中可见)的方法来使用 优点 易于实现:会话状态功能易于使用,为 ASP 开发人员所熟悉,并且与其他 .NET Framework 类一致 会话特定的事件:会话管理事件可以由应用程序引发和使用 持久性:放置于会话状态变量中的数据可以承受 IIS 重新启动和辅助进程重新启动,而不丢失会话数据,这是因为这些数据存储在另一个进程空间中 平台可缩放性:会话状态对象可在多计算机和多进程配置中使用,因而优化了可缩放性方案 尽管会话状态最常见的用途是与 Cookie 一起向 Web 应用程序提供用户标识功能,但会话状态可用于不支持 HTTP Cookie 的浏览器 缺点 性能:会话状态变量在被移除或替换前保留在内存中,因而可能降低服务器性能
使用会话状态 5.3.2 会话状态 标识会话 每个活动的 ASP.NET 会话都是使用 120 位的 SessionID 字符串进行标识和跟踪,该字符串只包含 URL 中所允许使用的 ASCII 字符 根据配置应用程序所设置的方式(支持还是不支持 Cookie),通过 HTTP Cookie 或嵌套有 SessionID 字符串的 URL 跨客户端-服务器请求标识会话 使用会话状态可以不再要求客户端支持 Cookie <configuration> <system.web> <sessionState cookieless="true"/> </system.web> </configuration> 在 Web.config 中配置
从会话状态获取数据应用举例 5.3.2 会话状态 <%@ WebService Language="C#" EnableSessionState="true" %> [WebMethod] public DataSet GetCurrentBalances(string acctID) { DataSet balances; balances = (DataSet) Session["CurrentBalances"]; if (balances == null) // retrieve current balances from database balances = GetCurrentBalancesLive(acctID); Session["CurrentBalances"] = balances; } return balances;
第5章 实现一个简单的 XML Web Service 管理 ASP.NET Web 服务的状态 调试 Web 服务
调试 Web 服务 Debug、 Trace 和 Switch 类 配置调试和跟踪设置 SOAP 扩展与跟踪 演示 用 SoapExtension 执行跟踪 调试 Web 应用程序的工具
Debug、Trace 和 Switch 类 Debug Debug 类通常用于调试输出窗口中显示信息 Trace Switches 控制跟踪,包括是否跟踪、跟踪的级别和跟踪的输出等 Listeners 收集跟踪输出信息
Trace 和 Debug 的区别 Trace 和 Debug 是属于 System.Diagnostics 命名空间中的两个类,区别如下 5.4.1 Debug、Trace 和 Switch 类 Trace 和 Debug 是属于 System.Diagnostics 命名空间中的两个类,区别如下 Debug 只工作在 debug builds 模式下,而 Trace 可以工作在 debug 和 release builds 模式下 Debug 通常在开发过程中使用,而 Trace 可以在部署和生产环境中使用 使用Trace 要特别小心,因为 Trace 可以在非调试模式下工作
写入跟踪信息的 Debug 和 Trace 方法 5.4.1 Debug、Trace 和 Switch 类 方法 输出 Assert 指定的文本;如果未指定任何文本,则为“调用堆栈”。只有当 Assert 语句中以参数形式指定的条件为 false 时,才会写入输出 Fail 指定的文本;如果未指定任何文本,则为“调用堆栈” Write 指定的文本 WriteIf 如果满足 WriteIf 语句中以参数形式指定的条件,则为指定的文本 WriteLine 指定的文本和一个回车 WriteLineIf 如果满足 WriteLineIf 语句中以参数形式指定的条件,则为指定的文本和一个回车
配置调试和跟踪 5.4.2 配置调试和跟踪设置 交互式调试 跟踪 配置 TraceSwitch 配置 listeners
配置交互式调试 修改 web.config 或者 machine.config 文件 5.4.2 配置调试和跟踪设置 修改 web.config 或者 machine.config 文件 只在调试应用程序时配置,在生产环境中应该尽量避免使用,因为这个配置会严重影响性能 <configuration> <system.web> <compilation defaultLanguage="c#" debug="true" /> </system.web> </configuration>
配置跟踪 Trace 可以在 web.config 中对所有页面集中配置,也可以在页面文件头中进行设置 5.4.2 配置调试和跟踪设置 Trace 可以在 web.config 中对所有页面集中配置,也可以在页面文件头中进行设置 <configuration> <system.web> <trace enabled="true" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" /> </system.web> </configuration>
配置 TraceSwitch 5.4.2 配置调试和跟踪设置 <configuration> 5.4.2 配置调试和跟踪设置 <configuration> <system.diagnostics> <switches> <add name="acctInfo" value="0" /> <add name="acctUpdates" value="4" /> </switches> </system.diagnostics> </configuration> TraceSwitch tsInfo = new TraceSwitch("acctInfo", "Info traces"); TraceSwitch tsUpdate = new TraceSwitch("acctUpdate", "Update traces"); Trace.WriteLineIf(tsInfo.TraceVerbose, "Writing all acctInfo traces."); Trace.WriteLineIf(tsUpdate.TraceVerbose,"Writing all acctUpdate traces."); ... tsInfo.Level = TraceLevel.Warning; Trace.WriteLineIf(tsInfo.TraceWarning,"some warning..."); tsInfo.Level = TraceLevel.Error; Trace.WriteLineIf(tsInfo.TraceWarning,"another warning...");
配置 listeners <configuration> <system.diagnostics> 5.4.2 配置调试和跟踪设置 <configuration> <system.diagnostics> <listeners> <add name="myTextListener" type="TextWriterTraceListener" initializeData="c:\myListeners.log" /> </listeners> </system.diagnostics> </configuration>
SOAP 扩展和跟踪 5.4.2/5.4.3 配置调试和跟踪设置 SOAP 扩展由 SoapExtension 类支持,ProcessMessage 是 SOAP 扩展的重要方法 使用 SOAP 扩展实现跟踪 从 SoapExtension 派生类 1 实现用户自定义属性 2 将自定义属性应用到 Web 服务方法上 3
演示 使用 SoapExtension 实现跟踪
调试 Web 应用程序的工具 页面级别和应用程序级别的跟踪 写入事件日志的编程方法 性能计数器 5.4.5 调试 Web 应用程序的工具 string LogName = "ContosoLog"; string AppName = "ContosoMicropayments"; EventLog Log = new EventLog(LogName); string Message = string.Format ("Invalid account number {0}",acctNumber); Log.Source = AppName; Log.WriteEntry(Message, EventLogEntryType.Warning);
应用程序级别跟踪 属性 说明 enabled 如果启用了应用程序级跟踪,则为 true;否则为 false,默认值为 false 5.4.5 调试 Web 应用程序的工具 属性 说明 enabled 如果启用了应用程序级跟踪,则为 true;否则为 false,默认值为 false pageOutput 如果跟踪信息显示在应用程序页面的末端,则为 true;否则为 false,注意:这个属性并不应用于Web 服务 requestLimit 服务器上存储的跟踪请求的数目,默认值为 10 traceMode 指示跟踪信息,是按它们被处理的顺序 (SortByTime) 显示,还是按用户定义类别的字母顺序 (SortByCategory) 显示,默认值为 SortByTime localOnly 如果跟踪查看器 (Trace.axd) 只在主机 Web 服务器上可用,则为 true;否则为 false,默认值为 true
应用程序级别跟踪配置和结果示例 配置示例 访问结果 http://servername/applicationname/trace.axd 5.4.5 调试 Web 应用程序的工具 配置示例 访问结果 <configuration> <system.web> <trace enabled="true" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" /> </system.web> </configuration> http://servername/applicationname/trace.axd
回顾 学习完本章后,将能够: 创建 Web 服务项目 实现 Web 服务的方法,对外提供方法以及控制方法的行为 在基于 ASP.NET 的 Web 服务中管理状态 调试 Web 服务
实验 实现一个简单的 XML Web Service 防火墙 Contoso Micropayment Web 服务 Woodgrove Bank Web 服务 Internet Web 服务消费者