创建网站服务-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 配置与排错指南”一节讨论,此外,还讨论一些排除的方法。
- 创建网站服务-2
- 创建网站服务(Web Services)
- 创建网站服务(Web Services)
- 利用SharePoint 2013 创建Service Desk 网站之规划服务表单和设计创建服务表单!
- 如何在IIS服务上创建站点网站
- 创建服务
- 创建服务删除服务
- 域名申请-企业网站创建-后期维护,个人全程为您定制服务
- VC 创建Windows服务程序2
- ubuntu 12.04.2创建ftp服务
- (2)创建一个服务和消息
- VC 创建Windows服务程序2
- web2.0服务网站
- 网站设计服务流程
- 网站安全检测服务
- 网站设计服务
- 网站开发服务
- 网站推广服务
- hdu 3068 and ural 1297
- sql与oracle中有关case和decode的用法(行转列)及比较
- hdu3999
- QT程序中文显示的其他方法
- JS学习之路--核心对象
- 创建网站服务-2
- log4cplus学习笔记
- junit unrooted tests initializationError和找不到或无法加载主类
- 在picture控件如何使用CToolTipCtrl提示控件
- ubuntu 安装rtesseract
- linux下socket函数解析
- Java 枚举7常见种用法
- hibernate一对多单向关联_XML
- uboot命令大全