日期:2014-03-19 浏览次数:20457 次
using System.Web.Services;public class MathService{ [WebMethod] public double Add(double x, double y) { return x + y; } [WebMethod] public double Subtract(double x, double y) { return x - y; } public double Multiply(double x, double y) { return x * y; } public double Divide(double x, double y) { return x / y; }}
为了在WebMethods框架组件重使用这个类,你需要把这个类编译为一个部件(assembly)并把它复制到虚拟目录的bin目录中。在这个例子中,Add和Subtract方法可以被暴露作为Web服务操作,但是Multiply和Divide却不能(因为它们没有使用[WebMethod]标记)。
你可以通过一个.asmx端点(endpoint)把Add和Subtract暴露为Web服务操作。为了实现这个功能,建立一个名为Math.asmx的包含下面的简单声明的新文本文件,并把它放到包含该部件的虚拟目录中(注意:它自己进入虚拟目录而不是子目录bin中):
<%@ WebService class="MathService"%>
这个声明告诉.asmx处理程序使用哪个类检查WebMethods,并且该处理程序自动处理其它的信息。例如,假定虚拟目录叫作"math"并且它包含了Math.asmx,并且bin子目录包含了该部件,那么浏览http://localhost/math/math.asmx将导致.asmx处理程序生成图2所示的文档页面。
这与.asmx处理程序如何工作有较大的变化。.asmx文件通常只包含通过名字引用Web服务类(如上所示)的WebService声明。因此,在这种情况下,该部件必须已经被编译好、配置到了虚拟目录的bin目录中。.asmx处理程序也提供.asmx文件中源代码的just-in-time(实时)编译。例如,下面的文件(叫作Mathjit.asmx)包含了WebService声明和被引用类的源代码。
<@% WebService class="MathServiceJit" language="C#"%>using System.Web.Services;public class MathServiceJit{ [WebMethod] public double Add(double x, double y) { return x + y; } [WebMethod] public double Subtract(double x, double y) { return x - y; } public double Multiply(double x, double y) { return x * y; } public double Divide(double x, double y) { return x / y; }}
第一次通过HTTP访问这个文件时,.asmx处理程序编译源代码并把部件配置到正确的位置。注意WebService声明必须提供语言,这样.asmx处理程序才能在运行时选择正确的编译器。这种方法的一个明显的问题是直到你第一次访问该文件时才会发现编译错误。
图2:MathService文档
当你使用Visual Studio .NET建立一个新的Web服务项目时,它通常使用"双文件"技术,把源文件与引用它的.asmx文件分开。集成开发环境(IDE)隐藏了这些文件,但是你可以点击"解决方案浏览器"工具条上的Show All Files(显示所有文件),你会发现项目中的每个Web服务类都有两个文件。实际上,Visual Studio .NET并不支持.asmx文件的高亮度提醒或IntelliSense。有了Web项目后,Visual Studio .NET也处理建立虚拟目录并自动把部件编译到虚拟目录的bin目录中。
在深入分析.asmx处理程序如何工作前,我们先简短讨论一下来自IIS的消息如何分派到用于处理的.asmx处理程序中。当输入的HTTP消息到达80端口时,IIS使用自己的元数据库(metabase)的信息来找出使用哪一个ISAPI DLL来处理这个消息。.NET安装程序把.asmx