自动生成WSDL
在您写好并部署了 WebMethod 之后,客户端需要明确知道为了与它成功通讯而必须使 SOAP 消息具有什么样的外观。提供 Web 服务说明的标准方法是通过 WSDL(以及嵌入的 XSD 定义)进行的。为了帮助适应这种情况,.asmx 处理程序自动生成可读的文档页,以及能准确反映 WebMethod 接口的 WSDL 定义。如果您对 WebMethod 应用了许多映射属性,则它们都会反映在生成的文档中。
如果您浏览 .asmx 文件,将会看到一个如图 2 所示的可供人工读取的文档页。此文档页是由一个名为 DefaultWsdlHelpGenerator.aspx(位于 C:\windows\Microsoft.NET\Framework\ v1.0.3705\config)的 .aspx 页生成的。如果您打开这个文件,将会发现这仅仅是一个标准的 ASP.NET 页,该页使用 .NET 反射生成文档。此功能允许您的文档总是与代码保持同步。您只需修改此文件即可自定义所生成的文档。
还可以通过在 Web.config 文件中指定一个不同的文档文件来避免在虚拟目录中生成文档:
- < configuration>
- < system.web>
- < webServices>
- < wsdlHelpGenerator href="MyDocumentation.aspx"/>
- < /webServices>
- ...
如果客户端对 .asmx 终结点发出 GET 请求,而且查询字符串中有 “?wsdl”,那么,.asmx 处理程序会生成 WSDL 定义,而不生成可供人工读取的文档。客户端可以使用 WSDL 定义来生成代理类,这些类可自动了解如何与 Web 服务通讯(例如,使用 .NET 中的 Wsdl.exe)。
自动生成WSDL:自定义过程
要自定义 WSDL 生成过程,可以编写一个 SoapExtensionReflector 类,并在 Web.config 文件中向 WebMethod 框架注册该类。然后,当 .asmx 处理程序生成 WSDL 定义时,它将调用反射器类,并使您有机会自定义向客户端提供的最终定义。有关如何编写 SoapExtensionReflector 类的更多信息,请查看 SoapExtensionReflectors in ASP.NET Web Services。
您还可以使用两种不同的方法来完全跳过 WSDL 生成过程。***种方法是,在虚拟目录中提供一个可供客户端访问的静态 WSDL 文档,然后通过将文档生成器从 Web.config 文件中删除来禁用它,如下所示:
- < configuration>
- < system.web>
- < webServices>
- < protocols>
- < remove name="Documentation"/>
- < /protocols>
- ...
另一种自动化程度较之稍高的方法是,使用 [WebServicesBinding] 属性来指定由 WebMethod 类实现的静态 WSDL 文档在虚拟目录中的位置。您还必须使用 [SoapDocumentMethod] 属性为每个 WebMethod 实现的 WSDL 绑定指定名称。这样做之后,WSDL自动生成过程将导入静态 WSDL 文件,并在它周围包装一个新的服务说明。
目前,因为仍没有太多可用的 WSDL 编辑器,所以手工编写 WSDL 是极其困难的。因此,文档/WSDL 的自动生成是 WebMethod 框架中很有价值的一部分,没有它,许多开发人员的日子会很难过。
【编辑推荐】