创建网站服务-2

来源:互联网 发布:linux 查看会话 编辑:程序博客网 时间:2024/04/28 02:51
创建网站服务

调用这个服务,使用参数 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")>]

type DnaWebService = class

inherit WebService

new() = {}

[<WebMethod(Description = "Gets a representation of a yeast molecule")>]

member x.GetYeastMolecule () =

let yeast = new molecule(id = "Yeast-tRNA-Phe")

let id = new identity(name = "Saccharomyces cerevisiae tRNA-Phe")

let tax = new taxonomy(domain = "Eukaryota", kingdom = "Fungi",

phylum = "Ascomycota", ``class`` = "Saccharomycetes",

order = "Saccharomycetales",

family = "Saccharomycetaceae",

genus = "Saccharomyces",

species = "Saccharomyces cerevisiae")

let numRange1 = new numberingrange(start = "1", Item = "10")

let numRange2 = new numberingrange(start = "11", Item = "66")

let numSys = new numberingsystem(id="natural", usedinfile=true)

numSys.Items <- [|box numRange1; box numRange2|]

let seqData = new seqdata()

seqData.Value <- "GCGGAUUUAG CUCAGUUGGG AGAGCGCCAG ACUGAAGAUC

UGGAGGUCCU GUGUUCGAUC CACAGAAUUC GCACCA"

let seq = new sequence()

seq.numberingsystem <- [|numSys|]

seq.seqdata <- seqData

id.taxonomy <- tax

yeast.identity <- id

yeast.sequence <- [|seq|]

yeast

end

 

    另外,简单的基于网站的测试选项同样可用,结果如下:

 

<?xml version="1.0" encoding="utf-8"?>

<molecule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="Yeast-tRNA-Phe">

<identity>

<name>Saccharomyces cerevisiae tRNA-Phe</name>

<taxonomy>

<domain>Eukaryota</domain>

<kingdom>Fungi</kingdom>

<phylum>Ascomycota</phylum>

<class>Saccharomycetes</class>

<order>Saccharomycetales</order>

<family>Saccharomycetaceae</family>

<genus>Saccharomyces</genus>

<species>Saccharomyces cerevisiae</species>

</taxonomy>

</identity>

<sequence>

<numbering-system id="natural" used-in-file="true">

<numbering-range>

<start>1</start>

<end>10</end>

</numbering-range>

<numbering-range>

<start>11</start>

<end>66</end>

</numbering-range>

</numbering-system>

<seq-data>GCGGAUUUAG CUCAGUUGGG AGAGCGCCAG ACUGAAGAUC

UGGAGGUCCU GUGUUCGAUC CACAGAAUUC GCACCA</seq-data>

</sequence>

</molecule>

 

虽然,这个示例只返回了静态的未改变的 XML 文档,没有什么特别的现实意义,但是,很容易看到这类应用程序的潜力。替换掉 GetYeastMolecule 方法,可以更现实的提供一个 GetMolecule 方法,取分子的名字作为参数,在数据库中查找这个分子的详细信息,返回分子数据的结果。优势在于,程序可以运行在任何平台上,来处理结果数据,这里,示例站点已经提供了 C++ 和 Java处理数据的 API,如你所见,在 F# 中处理这种数据非常简单。当然,这项技术并不限于分子生物学,使用 XML 样式的几乎所有领域都适用,科学、工程、数学和金融。

这样的网站服务应该是安全的,通过一些方法,使其只能被部分用户访问,或者在网络上传输的信息要加密可签名。一种方法是升级到 Windows 通信基础(Windows Communication Foundation,WCF),它类似于网站服务,但在这方面提供了更多的灵活性,将在下一节中讨论。另一种方法是配置网站服务器,处理这些安全需求,这将在“IIS 配置与排错指南”一节讨论,此外,还讨论一些排除的方法。

原创粉丝点击