开发基于接口的 .net web 服务

客户端软件需要添加一个对接口类型描述的引用和实现它的类,可以用下面二种方法之一添加接口引用,第一种方法是使用WSDL.exe命令行工具。通过使用/server开关,可以让WSDL.exe生成一个符合互联网服务描述的纯抽象类。假设接口描述在http://www.CalculationServices.com/ICalculator.asmx,用下面的格式运行WSDL.exe工具:

WSDL.exe /server /out: ICalculatorDef.cs
http://www.CalculationServices.com/ICalculator.asmx

  然后在客户端工程中添加ICalculatorDef. cs源文件。

  即使.NET知道该接口,/server开关生成一个带有抽象方法的纯抽象类:

public abstract class ICalculator : WebService
{
 [WebMethod]
 [SoapDocumentMethodAttribute("http://CalculationServices.com/Add"]
 public abstract int Add(int num1, int num2);
 // ICalculator方法的其余部分
}

  我们需要的是接口定义。打开ICalculatorDef.cs文件,删除WebService基本类,并把ICalculator的描述由抽象类改为接口,删除ICalculator类和其方法的所有属性以及所有方法中的public和abstract修饰符。经过这样的处理后,我们就得到了最原始的接口定义。

  第二种方法是,客户端 应用导入接口定义:在ICalculator服务中添加一个Web引用,然后从包装类中解析出接口的方法,将Add Web Reference向导指向含有接口定义的站点,就可以实现这一目的。此操作会生成一个被称为ICalculator的包装类,该类能够利用ICalculator原有的方法和互联网服务包装类的其他方法。用户只需要接口的方法定义即可,因此可以删除掉接口方法的实体和包括构造器在内的其他方法。删除接口方法中的SoapClientProtocol基本类和public修饰符,删除所有方法和类的属性。最后,将ICalculator的定义由类改为接口。这样,客户端应用就有了最原始的接口描述。

  第二步,客户端应用必须包含一个对实现接口的互联网服务的Web引用。再次使用 Add Web Reference向导将向导指向这些实现驻留的站点。在本例中,VS.NET生成了这些实现的包装类━━SimpleCalculator和ScientificCalculator。这些机器生成的包装类与与ICalculator无关,为了使ICalculator具有多态性,可以添加一个它的导出类。SimpleCalculator和ScientificCalculator如表5所示:

public class SimpleCalculator : SoapHttpClientProtocol, ICalculator
{
 public SimpleCalculator()
 {
  Url ="http://www.CalculationServices.com
     /SimpleCalculator.asmx";
 }

 [SoapDocumentMethod("http://CalculationServices.com/Add")]
 public int Add(int num1,int num2)
 {
  object[] results = Invoke("Add", new object[]{num1,num2});
  return (int)(results[0]);
 }
 file://Other method wrappers
 }


 public class ScientificCalculator : SoapHttpClientProtocol, ICalculator
 {
  public ScientificCalculator()
  {
   Url = "http://www.CalculationServices.com/
       ScientificCalculator.asmx";
  }

[SoapDocumentMethod("http://CalculationServices.com/Add")]
public int Add(int num1,int num2)
{
 object[] results = Invoke("Add", new object[]{num1,num2});
 return (int)(results[0]);
}
 file://Other method wrappers
}

  在使用Add Web Reference向导生成包装类后,将它们修改成基于接口的类。

  下面是一个客户端设计模板:ICalculator提供了服务定义。互联网服务的位置是由通过继承得来的SimpleCalculator或ScientificCalculator生成的,包装类知道如何转发对互联网应用的调用,但并不清楚它在 服务器端的具体实现,SimpleCalculator和ScientificCalculator之间的所有区别只不过是它们封装的服务地址或者提供商不同而已。

  在有了上面的基础之后,我们就可以编写基于接口的、多态性的互联网服务应用。如果仔细观察,我们还会发现一个有趣的现象:站在客户端应用的角度来看,服务的位置━━URL是一个对象。

  在未来数年内,互联网服务将成为几乎每个编程人员职业生涯中不可或缺的一部分,然而,与我们在intranet上已经熟悉的面向组件的编程和现有的设计方法学相比,互联网服务的支持工具还是相当不成熟的,目前最大的挑战是如何把二者结合起来。我希望这篇文章使你能够不要因为VS.NET不支持就放弃一些成熟和很好的理念,通过把二者结合起来或者能够对URL与对象相同有一个正确的认识,我们完全可以把一些成熟的理念应用在崭新的领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值