为什么需要Web Service

在通过internet网购买商品后,你可能对配送方式感到迷惑不解。经常的情况是因配送问题找配送公司而消耗你的大量时间,对于配送公司而言这也不是一项增值服务。

  为了解决这种问题,配送公司需要在不降低安全级别的情况下了解更多的递送信息,然而安全公司设计的安全系统却非常复杂。那么我们能不能只使用80端口(web服务器端口)并且只通过web服务器提供信息呢?所以,我们建立了一个全新的web应用程序以便从核心商业应用程序中获得数据。配送公司将为些东西付money,所有的公司都希望能够将注意力集中在核心商业应用上。

什么是Web Service?

  Web Service是一种构建应用程序的普通模型,并能在所有支持internet网通讯的操作系统上 实施。Web Service令基于组件的开发和web的结合达到最佳,基于组件的对象模型,象: Distributed Component Object Model (DCOM), Remote Method Invocation (RMI), 和 Internet Inter-Orb Protocol (IIOP) 都已经发布很长时间了,不幸的是这些模型都依赖于特殊对象模型协议。Web Service利用soap和Xml对这些模型在通讯方面作了进一步的扩展以消除特殊对象模型的障碍。

  Web Service主要利用http和soap协议使商业数据在web传输, saop通过http调用商业对象执行远程功能调用,web用户能够使用soap和http通过web调用的方法来调用远程对象。

那么怎样使在位置a的用户明白位置b的Web Service的意思呢?这个问题可以通过和一个一致的共同标准来回答。描述性服务语言(Service Description Language (SDL)),soap订约语言(SOAP Contract Language (SCL) )和网络访问规范语言(Network Accessible Specification Language (NASSL) )都是为这个目的建立的相似语言,然而IBM和微软都同意Web Service Description Language (WSDL)作为Web Service 的标准语言。

Web Service部件的结构由Web Service Description Language.描述,wsdl1.1是一份Xml文档,描述了Web Service的属性和接口。新的规范可以在msdn.microsoft.com/Xml/general/wsdl.asp了解到。

当前的任务

最好的学习方法是创建一个Web Service,我们以一个股票报价系统为例,纳斯达克和澳大利亚股票交易系统都是非常有名的例子,他们都提供了一个接口,用于输入公司代码和接受最终成交的股票价格。

我们复制一个相同的功能的Web Service。

我们的Web Service的输入参数是股票代码,Web Service通过调用中间层商业逻辑函数获得股票价格,商业逻辑函数保持以最小的部分集中在Web Service上。

Web Service开发工具

实现这个应用程序的核心部件将是微软 .net framework sdk,不过他现在还是一个试用版,你可以在微软站点下载,我的配置是:操作系统 windows 2000 server,pIII300,300mb内存。

创建Web Service的首选集成开发环境(IDE)是visual studio.net, 然而,你可以用任何一种文本编辑器(wordpad,notepad,visual studio6.0)轻易创建一个Web Service文件。
创建Web Service

我将用c#创建一个Web Service 叫SecurityWebService。一个Web Service文件的扩展名是:.asmx(就象asp.net的文件扩展名.aspx那样),文件的第一行是:

<%@ WebService Language="C#" class="SecurityWebService" %>

这个语句的含义是:告诉编译器运行Web Service模式,还有c#类名。我们还需要访问Web Service名字空间,这也是引用系统名字空间的一次好实践。

using System;
using System.Web.Services;

SecurityWebService 应该继承了Web Service类的功能,因此我们有必要加入下面这行代码

public class SecurityWebService : WebService

  现在我们使用面向对象的编程技巧创建一个类,c#的类与c++和java非常相似,用C#建一个类件象去公园散步那样简单,而且不需要任何技巧。

  C#的基本数据类型设计的非常聪明,因此,如果我们返回"int," "float," 或者 "string" ,那么将自动将他们转变成标准Xml输出。不幸的是,在大多数例子中我们需要将获得的数据集合看成一个单一的实体(single entity)。现在我们举一个例子。

我们的 SecurityWebService 股票报价系统需要用户输入股票代码,并且还将返回完整的公司名和现行股票价格,所以对一只股票而言我们有三个信息块。

1、公司代码(string)

2、公司名(string)

3、价格(double)

  当我们提交股票时,我们需要提取所有三种数据,有几种方法来完成这项工作,最好的方法是将他们绑定到一种可被枚举的数据类型内,我们在c#中可用"struct"来完成,c#中的"struct"和c++中的结构很相似。

public struct SecurityInfo
{
public string Code;
public string CompanyName;
public double Price;
}

  我们可以通过模块创建Web Service,代码如下:

<%@ WebService Language="C#" class="SecurityWebService" %>

using System;
using System.Web.Services;

public struct SecurityInfo
{
public string Code;
public string CompanyName;
public double Price;
}

public class SecurityWebService : WebService
{
private SecurityInfo Security;

public SecurityWebService()
{
Security.Code = "";
Security.CompanyName = "";
Security.Price = 0;
}

private void AssignValues(string Code)
{
// This is where you use your business components. 
// Method calls on Business components are used to populate the data.
// For demonstration purposes, I will add a string to the Code and
// use a random number generator to create the price feed.

Security.Code = Code;
Security.CompanyName = Code + " Pty Ltd";
Random RandomNumber = new System.Random();
Security.Price = double.Parse(new System.Random(RandomNumber.Next(1,10)).NextDouble().Format("##.##",null));
}

[WebMethod(Description="This method call will get the company name and the price for a given security code.",EnableSession=false)]
public SecurityInfo GetSecurityInfo(string Code)
{
AssignValues(Code);
SecurityInfo SecurityDetails = new SecurityInfo();
SecurityDetails.Code = Security.Code;
SecurityDetails.CompanyName = Security.CompanyName;
SecurityDetails.Price = Security.Price;
return SecurityDetails;
}

}

记住所有用户都能通过http访问Web Service,也许你会谈到代码中的机密商业数据和不希望其他人知道的数据,怎样保守数据机密。解决方法是保护商业逻辑功能块,只允许访问表示层,在 c#中可以通过使用关键字"[Web Method]"来达到这个目的,我们看看下面的代码:

[WebMethod(Description="This......",EnableSession=false)]
public SecurityInfo GetSecurityInfo(string Code)

  这个函数显示给公众,description标记用于描述Web Service的功能,由于我们不能存储任何会话数据,我们就将消除会话状态。

private void AssignValues(string Code)

这个商业逻辑函数不被公众所知,我们不希望敏感的商业信息被公布在web上(注意:甚至将private改为public,公众仍然看不见,为什么呢?,这是由于没有使用[Web Method]关键字。)

我们可以在这个函数中利用商业逻辑获得最新的股票报价,为了这个目的,我在代码中添加了文本框以便输入公司名称,价格由一个随机函数产生。

我们把这个文件以SampleService.asmx保存在IIS目录下。我将他保存在虚拟目录"/work/aspx"下,在WEB浏览器中的相似如下图:

这个WEB页是由.NET framework生成的,我们没有创建这个页(这是由系统自动生成的,我们没有为他写任何一行代码,这附图是先前代码的副产品),准备使用的功能对单一的Web Service是相当合适的。

使用asp.net和config.web文件可以很轻松的改变该页。不过要注意那个SDL规范的链接(即使我们我们使用WSDL,.NET 版仍然引用了SDL,这个问题在下一个版本中有希望矫正),这是Web Service的一个描述文件目的是创建一个代理对象,这基本上给出Web Service的一个大致介绍,如果你对这些都比较熟悉,你可以只看"Web-only"方法,SDL规范对所有私有函数和属性都未描述, SecurityWebService 类的SDL规范在例程A中看到。
怎样使用Web Service

现在我们能够使用这个Web Service了,让我们输入一个值获得一个假的价格。

点击Invoke按钮,将显示一个下面这样的新窗口和Xml文档。

这显示了Web Service怎样发布信息,我们需要设计一个客户端来显示Xml文档,这个客户端应该是:

1、一个Web 页

  2、控制台或Windows应用程序

3、能和移动电话交互的WML或Wmlscript

4、能在PDA上使用的Palm或Windows ce应用程序

在后面我将解释建立客户端的过程

  可以通过http get方法直接调用Web Service,在这个例子中将不通过上面的web页和点击invoke按钮获得Xml文档,我们直接用http get方法调用Xml文档,那么语法应下:

http://server/webServiceName.asmx/functionName?parameter=parameterValue

所以对我们这个例子而言,语句将是:

http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo?Code=IBM

这与点击invoke按钮效果一样,将产生同样的结果。

现在我们知道怎样创建并使用一个Web Service,但我们的工作还只完成了一半。怎样使客户端发现Web Service呢?在internet网上通过什么途径搜索Web Service呢?是否通过象雅虎搜索引擎那样的搜索引擎呢?为了解决这些问题我们需要为Web Service创建一个"discovery" 文件。

创建"discovery" 文件

  发现Web Service是询问并定位Web Service描述的过程,是访问Web Service的预备过程,客户端通过发现Web Service的过程获得Web Service的存在,大小,怎样和他交互,"discovery" 文件是一个扩展名为 :.disco的Xml文档。不必强制性地要求为每个Web Service创建一个"discovery" 文件,下面是本文例子的"discovery" 文件实例:

<?Xml version="1.0" ?>
<dynamicDiscovery Xmlns="urn:schemas-
dynamicdiscovery:disco.2000-03-17">
</dynamicDiscovery>

配置Web Service

配置Web Service非常简单,与asp.net应用文件相似,将.asmx和.disco文件复制到相应的目录下就行了。

Web Service的将来

Web Service的将来是非常光明的,现在不单是微软在发展Web Service技术,IBM和SUN也致力于发展Web Service,SOAP toolkits已经可以在Apache 和 Java Web servers上使用,不过我相信对于Web Service还需要做一点工作,尤其是Web Service发现过程,她实在是太原始了。

Web Service将在WEB上映入一些新的观念,有一点我相信是付费浏览,就象付费电视一样,我们建立WEB站点并对用户收费, 就象付费电视一样,用户只需要付一点费用,这在商业上是可行的。
附实例A

<?Xml version="1.0" ?> 
<serviceDescription Xmlns:s0="http://tempuri.org/" name="SecurityWebService" targetNamespace="http://tempuri.org/" 
Xmlns="urn:schemas-Xmlsoap-org:sdl.2000-01-25">
<soap Xmlns="urn:schemas-Xmlsoap-org:soap-sdl-2000-01-25">
<service>
<addresses>
<address uri="http://localhost/work/aspx/SampleService.asmx" /> 
</addresses>
<requestResponse name="GetSecurityInfo" soapAction="http://tempuri.org/GetSecurityInfo">
<request ref="s0:GetSecurityInfo" /> 
<response ref="s0:GetSecurityInfoResult" /> 
<info>This method call will get the company name and the price for a given security code.</info> 
</requestResponse>
</service>
</soap>
<httppost Xmlns="urn:schemas-Xmlsoap-org:post-sdl-2000-01-25">
<service>
<requestResponse name="GetSecurityInfo" href="http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo">
<request>
<form>
<input name="Code" /> 
</form>
</request>
<response>
<mimeXml ref="s0:SecurityInfo" /> 
</response>
<info>This method call will get the company name and the price for a given security code.</info> 
</requestResponse>
</service>
</httppost>
<httpget Xmlns="urn:schemas-Xmlsoap-org:get-sdl-2000-01-25">
<service>
<requestResponse name="GetSecurityInfo" href="http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo">
<request>
<param name="Code" /> 
</request>
<response>
<mimeXml ref="s0:SecurityInfo" /> 
</response>
<info>This method call will get the company name and the price for a given security code.</info> 
</requestResponse>
</service>
</httpget>
<schema targetNamespace="http://tempuri.org/" attributeFormDefault="qualified" 
elementFormDefault="qualified" Xmlns="http://www.w3.org/1999/XmlSchema">
<element name="GetSecurityInfo">
<complexType>
<all>
<element name="Code" Xmlns:q1="http://www.w3.org/1999/XmlSchema" type="q1:string" nullable="true" /> 
</all>
</complexType>
</element>
<element name="GetSecurityInfoResult">
<complexType>
<all>
<element name="result" type="s0:SecurityInfo" /> 
</all>
</complexType>
</element>
<complexType name="SecurityInfo">
<all>
<element name="Code" Xmlns:q2="http://www.w3.org/1999/XmlSchema" type="q2:string" nullable="true" /> 
<element name="CompanyName" Xmlns:q3="http://www.w3.org/1999/XmlSchema" type="q3:string" nullable="true" /> 
<element name="Price" Xmlns:q4="http://www.w3.org/1999/XmlSchema" type="q4:double" /> 
</all>
</complexType>
<element name="SecurityInfo" type="s0:SecurityInfo" /> 
</schema>
</serviceDescription>

怎样创建.NET Web Service http://blog.csdn.net/xiaoxiaohai123/article/details/1546941的更多相关文章

  1. K8S 使用NFS 创建PV和PVC的例子 学习From https://blog.csdn.net/xts_huangxin/article/details/51494472

    1. 获取资料 网址: https://blog.csdn.net/xts_huangxin/article/details/51494472  感谢原作者 这里面 按照自己的机器情况进行了学习模仿 ...

  2. git创建使用1https://blog.csdn.net/Hanani_Jia/article/details/77950594

    这篇文章是我自己写的关于GitHub的内容,从我刚听到这个直到设置成功每一步都有详细的步骤来解释,其中有一些截图或者代码来自于网上. 首先,我先对GitHub来一个简单的介绍,GitHub有一个很强大 ...

  3. 转-spring-boot 注解配置mybatis+druid(新手上路)-http://blog.csdn.net/sinat_36203615/article/details/53759935

    spring-boot 注解配置mybatis+druid(新手上路) 转载 2016年12月20日 10:17:17 标签: sprinb-boot / mybatis / druid 10475 ...

  4. AutoFac控制反转 转载https://blog.csdn.net/u011301348/article/details/82256791

    一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...

  5. 手把手教你如何玩转消息中间件(ActiveMQ) https://blog.csdn.net/cs_hnu_scw/article/details/81040834

    #情景引入小白:起床起床起床起床....快起床~我:怎么了又,大惊小怪,吓到我了.小白:我有事有事想找你,十万火急呢~~我:你能有什么事?反正我不信..那你说说看~~小白:就是我有两个小表弟,叫大白和 ...

  6. 转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101

    Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要 ...

  7. http://blog.csdn.net/luoshengyang/article/details/6651971

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6651971 在Android系统中,提供了独特 ...

  8. [Android Pro] https://blog.csdn.net/gaugamela/article/details/79143309

    原文地址:https://blog.csdn.net/gaugamela/article/details/79143309 最近遇到这样一个问题: 第三方的SDK除了Jar包外,还提供了对应的so文件 ...

  9. Consul+upsync+Nginx实现动态负载均衡 摘自https://blog.csdn.net/qq_29247945/article/details/80787014

    传统感念:每次修改完nginx配置文件,要重启nginx 动态感念:每次修改完nginx配置信息,不需要重启,nginx实时读取配置信息. Nginx: 反向代理和负载均衡 Consul:是用go编写 ...

随机推荐

  1. 读《MySql必知必会》笔记

    MySql必知必会 2017-12-21 意义:记录个人不注意的,或不明确的,或不知道的细节方法技巧,此书250页 登陆: mysql -u root-p -h myserver -P 9999 SH ...

  2. 基于2.9.6vue-cli初始化webpack工程

    前天做了组内的分享 讲了些webpack的东西 整个流程以及build文件夹内webpack相关的一些js所有的代码 每行代码什么意思 有什么作用 都做了很详细的标明. webpack是3.6的 今天 ...

  3. 【bzoj2795】[Poi2012]A Horrible Poem Hash+分解质因数

    题目描述 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. 输入 第一行一个正整数n (n<= ...

  4. 【bzoj3210】花神的浇花集会 旋转坐标系

    题目描述 在花老师的指导下,每周4都有一个集会活动,俗称“浇水”活动. 具体浇水活动详情请见BZOJ3153 但这不是重点 花神出了好多题,每道题都有两个参考系数:代码难度和算法难度 花神为了准备浇花 ...

  5. ESXi 给虚拟机添加网络串口

    之前的有点儿小问题,我再更新下: Notice: 要看配没配对,能不能通,得先把虚拟机开开,在关机状态下,这种telnet方式一直是连不通的. 1. 先将ESXi的SSH开启(不知道不开行不行): 2 ...

  6. 爬虫【自动登陆github和抽屉】

    自动登陆github用户详情页 代码 #! /usr/bin/env python # -*- coding: utf- -*- # __author__ = "wuxiaoyu" ...

  7. 【POJ3352】Road Construction(边双联通分量)

    题意:给一个无向图,问最少添加多少条边后能使整个图变成双连通分量. 思路:双连通分量缩点,缩点后给度为1的分量两两之间连边,要连(ans+1) div 2条 low[u]即为u所在的分量编号,flag ...

  8. Linux之进程的等待与其内核实现解析

    进程通过fork产生子进程,进程也会死亡,进程退出的时候将会进行内核清理,释放所有进程的资源,资源包括:内存资源,文件资源,信号量资源,共享内存资源,或者引用计数减一,或者彻底释放.     不过进程 ...

  9. 去掉 NavigationBar 底部的那条黑线

    //加入下面两行代码即可[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UI ...

  10. python--导入就方便实现你需要的功能(模块)

    模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保存了 ...