创建一个简单的Web Service
上一章节中提到Web Service与网页的相似之处,这里在总结下:
1。由和通用语言运行时完全实现,包含面向对象架构,所有基类,还有一些特性,如缓存、状态和数据访问
2。几乎一致的文件和代码结构
3。所有源代码文件都是普通文本
4。vs完全支持,可以使用vs十分便捷的编辑、调试
5。使用一个基于普通文本的配置文件和vs的网站管理工具做全局或者应用程序级配置。
Web Service没有界面,它只有方法,有一些事支持从客户端远程调用的。Web Service文件的后缀名为asmx。
在Web Service应用程序第一次运行时,如果Web Service是人工编译的,并且被放在虚拟跟目录的bin目录下,那么代码隐藏对于内联编码有性能优势,因为asmx文件在Web Service运行时都会被编译成一个类。而ASP.NET 2.0在默认情况下没有这一优势,因为ASP.NET 2.0 把源代码放在App_Code目录下,并且在第一个使用时编译。
下面是一个实例(股票跟踪,不使用数据库,只是为了演示,故使用二维数组)
这个Web Service提供两个方法:
GetName:参数是一个StcokSymbol对象,返回一个字符串,内容是股票名称
GetPrice:参数是一个StcokSymbol对象,返回一个数字,表示当前股票的价格
我使用的是vs2010,
首先新建一个项目(WebSite也可以),注意选择.NET Framework 3.5,默认4是没有Web Service选项的。选择ASP.NET Web Service Application,命名为StockWebService,如图
我们可以看到,vs自动为我们生成了一些代码:
- /// <summary>
- /// Summary description for Service1
- /// </summary>
- [WebService(Namespace = "http://tempuri.org/")]
- [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
- [System.ComponentModel.ToolboxItem(false)]
- // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
- // [System.Web.Script.Services.ScriptService]
- public class Service1 : System.Web.Services.WebService
- {
- [WebMethod]
- public string HelloWorld()
- {
- return "Hello World";
- }
- }
添加以下方法
- [WebMethod]
- public double GetPrice(string stockSymbol)
- {
- for (int i = 0; i < stocks.GetLength(0); i++)
- {
- if (string.Compare(stockSymbol, stocks[i, 0], true) == 0)
- return Convert.ToDouble(stocks[i, 2]);
- }
- return 0;
- }
- [WebMethod]
- public string GetName(string stockSymbol)
- {
- for (int i = 0; i < stocks.GetLength(0); i++)
- {
- if (string.Compare(stockSymbol, stocks[i, 0], true) == 0)
- return stocks[i, 1];
- }
- return "Symbol not found.";
- }
虽然是可选选项,但是它有几个优点,主要优点是可获得对ASP.NET几个常见对象的访问权:
Application对象和Session对象(状态管理)、User对象(验证Web服务器调用者的身份)、Context对象(可以访问HttpContext类中调用者请求的所有特定HTTP信息)
当然也不可不继承WebService类,可能是为了克服来自.NET Framework的限制。
通过HttpContext控制Application状态
Web Service可通过HttpContext控制Application对象(也可以访问所有的ASP.NET资源)
例:在Service1.asmx.cs中添加如下方法:
- /// <summary>
- /// set exchange of stock
- /// </summary>
- /// <param name="exchange"></param>
- [WebMethod]
- public void SetStockExchange(string exchange)
- {
- Application["exchange"] = exchange;
- }
- [WebMethod]
- public string GetStockExchange()
- {
- return Application["exchange"].ToString();
- }
WebServiceBinding特性
Web Service描述语言(WebServices Description Language,WSDL)定义的绑定可作为.NET类访问WebService的接口。即绑定会定义一系列操作。一个WebService类有一个默认的绑定,它包含该类的所有Web方法,该类不存在与非默认绑定的关联。WebServiceBinding特性用于识别非默认绑定。WebService类可以具有多个WebServiceBinding特性,每一个都可以指定不同的绑定。如果Name属性被忽略,那个这个特性将指定默认绑定。
属性 | 类型 | 读 | 写 | 说明 |
ConformsTo | WsiProfiles | ╳ | ╳ | 绑定需要遵守的WS-1标准 |
EmitConformanceClaims | Boolean | ╳ | ╳ | 如果为true,当WSDL描述时,绑定会发出遵守的声明 |
Location | String | ╳ | ╳ | 定义绑定的位置,默认值为当前Web Service的URL |
Name | String | ╳ | ╳ | 绑定名称 |
Namespace | String | ╳ | ╳ | 与绑定关联的命名空间 |
WebMethod特性
Web Service由WebService类定义的,对于WebService类而言,并不需要将所有的方法提供给Web Service使用者。对需要提供的方法,须:
1。声明为public
2。在方法声明之前设置WebMethod特性(即加上[Web Service])
WebMethod包含一些属性,用于设定web方法的行为。语法:[WebMethod(PropertyName=value)],以下是一些属性的说明
BufferResponse:默认情况下,ASP.NET在从服务器端向客户端发送响应之前,会对整个响应进行缓存。多数情况下,这是最好的做法。但是,如果响应非常长,那么需将 它设为false类禁用缓存,如果设为false,则返回到客户端的响应时16kb的块。默认值为true
CacheDuration:如同网页,Web Service也能够把返回到客户端的结果进行缓存(有点:如果客户端发出的请求与由另一个客户端发出的请求完全一致是,那么服务器就返回缓存中的响应,可以改善性能)。CacheDuration定义第一次请求之后的多少秒内,会在响应中将缓存页被发送给随后的请求。一旦缓存过期,则发送新页面给请求。默认值为0,即禁用结果缓存。如果web'方法返回的数据没有改变(如:从一小时更新一次数据库中获取数据的查询),那么就可以设置结果缓存为一个合适的时间,例如1800(30分钟)。令一方面,如果返回的数据是动态的,那么需要设置缓存持续时间较短或干脆禁用。如果Web Service没有一个相对有限的参数范围,缓冲也不适合使用。
Description:对web方法的描述,字符串类型
EnableSession:默认为false。如果设为true,web方法将启用会话状态。如果设为ture且Web Service继承自WebService类,那么会话可以使用WebService.Session。允许会话状态为应用程序增加了额外的开销。
MessageName:在C#类中,方法可以拥有相同的名字(重载),Web Service禁止使用重载。WebMethod特性的MessageName属性可以消除由多个相同名称造成的无法识别的问题。它允许对每一个方法的重载使用唯一的别名。当重载方法在SOAP消息中引用时,SOAP消息将使用MessageName而非方法的名称。
TransactionOption:ASP.NET web方法可以使用事务,但是仅当事件在web方法中初始化时可以使用。TransactionOption属性用于设置web方法是否启动一个事务。然而,因为web方法的事务必须为根对象,所有只有两个不同的行为,启用一个新对象(Required、RequiresNew)或者不启动(Disabled、NotSupported、Supported)。如果在Web Service中启用事务,需:1。添加System.EnterpriseServices.dll引用 ;2。添加命名空间(using System.EnterpriseServices;);3。向WebMethod特性添加TransactionOption属性,并设置为Required(或RequiresNew)
本文转自xshf12345 51CTO博客,原文链接:http://blog.51cto.com/alexis/573720,如需转载请自行联系原作者