level 10
hadstj
楼主
创建网站服务
调用这个服务,使用参数 46 和 28,将产生下面的 xml:
<?xml version="1.0" encoding="utf-8" ?>
<int xmlns="http://strangelights.com/FSharp/Foundations/WebServices">74</int>
在网络上发送少量的数据,通常并不高效,因为每一个请求都必须发送一定数量的元数据。通常,更好的办法是构建一个不“叽叽喳喳”的应用程序,即,应用程序产生一个大请求,重复产生许多小的请求。
网站服务将企图序列化任意的 .NET 对象,方法转换成 xml;然而,结果可能有个点不可预测,产生的 XML 数据可能不包含所有期望的字段,与其他编程语言的处理相比可能困难一些。要避免这个,最好使用 XSD 样式去定义想要跨网站服务传递的对象。XSD 样式是一种 XML 文档类型,它描述 XML 文档的结构,说明哪些字段是强制的,字段应该按什么顺序出现。这些样式成为网站服务定义的一部分,使用网站服务的任何人都能了解从自网站服务会得到什么字段。简化网站服务定义的更好方法是只有一个字段,包含二进制或者十六进制数据,因为网站服务的用户能更好的理解结果的意思。
虽然可以自定义 XML 样式,但是 Visual Studio 能用几种图形模式和一个基于文本的模式来创建;还可以在这个领域中其他工作的基础上构建,在网站在有许多预定义样式可供下载。例如,下面将要看到的示例使用 RNAML,这是一个样式,可以 http://www-lbit.iro.umontreal.ca/rnaml/ 上找到;为想交换有关 RNA 信息 (核醣核酸,分子生物学研究的课题)的人提供 XML 格式的样式。从站点下载样式以后,可以把样式转换成 .NET 表示,使用命令行工具 xsd.exe。这个工具创建 C# 类来表示 XML 数据;通常,在 XML 中的每一个标记成为 .NET 中的一个类。
这个 C# 文件然后被编译成一个 .NET 程序集,在 F# 中使用,就像使用其他 .NET 库一样。完整命令行应该是:xsd rnaml.xsd /classes,需要把下载样式的文件 rnaml.xml 改名为 rnaml.xsd,工具才能正确运行。
注意 对于一些复杂样式,通过 xsd.exe 产生的代码并不总是很好地序列化成 XML;不幸的是,RNAML 就是这种情况。随着时间的推移,修复 xsd.exe 的这个漏洞已成为可能,随 .NET框架 2.0 发行的 xsd.exe 版本已经比以前的版本有显著地改进。在 MSDN 论坛上有一方法可用于产生代码: http://forums.microsoft.com/msdn/showpost.aspx?postid=87289&siteid=1。另外,因为受影响的类没有用在这个示例中,你可以像我做的一样,简单地注释掉受影响的类(numberingtable、coordinates 和 revision),在这个代码中大约有五、六个引用它们。
下面的示例展示如何创建一个网站服务,返回一个酵母 RNA 分子的结构。这个是 RNAML网站上序列(sequence)示例的一个省略版本 ( http://www-lbit.iro.umontreal.ca/rnaml/)。像之前一样,需要一个 .asmx 文件对连接对.NET 类型的文件请求,这个类型将处理请求。这里是:
<%@ WebService Class="Strangelights.WebServices.DnaWebService" %>
清单 10-7 展示了这个网站服务;你将注意到服务的基本组件是如何与我们之前的简单网站服务一样。有一个类定义,标志为 WebService 属性。这段代码的实际工作就是方法定义 getyeastmolecule;这里创建和发布不同对象在由rnaml.xsd 文件创建的库中定义,比如 molecule 对象和 sequence 对象。
清单 10-7。创建一个网站服务,返回 RNA 分子的定义
#light
namespace Strangelights.WebServices
open System.Web.Services
[<WebService(Namespace =
"http://strangelights.com/FSharp/Foundations/DnaWebService")>]
2013年01月22日 14点01分
1
调用这个服务,使用参数 46 和 28,将产生下面的 xml:
<?xml version="1.0" encoding="utf-8" ?>
<int xmlns="http://strangelights.com/FSharp/Foundations/WebServices">74</int>
在网络上发送少量的数据,通常并不高效,因为每一个请求都必须发送一定数量的元数据。通常,更好的办法是构建一个不“叽叽喳喳”的应用程序,即,应用程序产生一个大请求,重复产生许多小的请求。
网站服务将企图序列化任意的 .NET 对象,方法转换成 xml;然而,结果可能有个点不可预测,产生的 XML 数据可能不包含所有期望的字段,与其他编程语言的处理相比可能困难一些。要避免这个,最好使用 XSD 样式去定义想要跨网站服务传递的对象。XSD 样式是一种 XML 文档类型,它描述 XML 文档的结构,说明哪些字段是强制的,字段应该按什么顺序出现。这些样式成为网站服务定义的一部分,使用网站服务的任何人都能了解从自网站服务会得到什么字段。简化网站服务定义的更好方法是只有一个字段,包含二进制或者十六进制数据,因为网站服务的用户能更好的理解结果的意思。
虽然可以自定义 XML 样式,但是 Visual Studio 能用几种图形模式和一个基于文本的模式来创建;还可以在这个领域中其他工作的基础上构建,在网站在有许多预定义样式可供下载。例如,下面将要看到的示例使用 RNAML,这是一个样式,可以 http://www-lbit.iro.umontreal.ca/rnaml/ 上找到;为想交换有关 RNA 信息 (核醣核酸,分子生物学研究的课题)的人提供 XML 格式的样式。从站点下载样式以后,可以把样式转换成 .NET 表示,使用命令行工具 xsd.exe。这个工具创建 C# 类来表示 XML 数据;通常,在 XML 中的每一个标记成为 .NET 中的一个类。
这个 C# 文件然后被编译成一个 .NET 程序集,在 F# 中使用,就像使用其他 .NET 库一样。完整命令行应该是:xsd rnaml.xsd /classes,需要把下载样式的文件 rnaml.xml 改名为 rnaml.xsd,工具才能正确运行。
注意 对于一些复杂样式,通过 xsd.exe 产生的代码并不总是很好地序列化成 XML;不幸的是,RNAML 就是这种情况。随着时间的推移,修复 xsd.exe 的这个漏洞已成为可能,随 .NET框架 2.0 发行的 xsd.exe 版本已经比以前的版本有显著地改进。在 MSDN 论坛上有一方法可用于产生代码: http://forums.microsoft.com/msdn/showpost.aspx?postid=87289&siteid=1。另外,因为受影响的类没有用在这个示例中,你可以像我做的一样,简单地注释掉受影响的类(numberingtable、coordinates 和 revision),在这个代码中大约有五、六个引用它们。
下面的示例展示如何创建一个网站服务,返回一个酵母 RNA 分子的结构。这个是 RNAML网站上序列(sequence)示例的一个省略版本 ( http://www-lbit.iro.umontreal.ca/rnaml/)。像之前一样,需要一个 .asmx 文件对连接对.NET 类型的文件请求,这个类型将处理请求。这里是:
<%@ WebService Class="Strangelights.WebServices.DnaWebService" %>
清单 10-7 展示了这个网站服务;你将注意到服务的基本组件是如何与我们之前的简单网站服务一样。有一个类定义,标志为 WebService 属性。这段代码的实际工作就是方法定义 getyeastmolecule;这里创建和发布不同对象在由rnaml.xsd 文件创建的库中定义,比如 molecule 对象和 sequence 对象。
清单 10-7。创建一个网站服务,返回 RNA 分子的定义
#light
namespace Strangelights.WebServices
open System.Web.Services
[<WebService(Namespace =
"http://strangelights.com/FSharp/Foundations/DnaWebService")>]