一、WebService基本概念
1.1 目的
WebService的目的是为了使各个孤立的站点能够相互通信、共享资源。
1.2 标准
WebSerice使用的是Internet上统一的、开放的标准:http、xml、soap[简单对象访问协议,是一个用于分散和在分布式环境下交换网络信息的基于XML通信的协议。在此协议下,软件组件或应用程序能够通过标准的http协议进行通信]、wsdl...
1.3 定义
通过SOAP在web上提供的软件服务,使用wsdl文件进行说明,并通过uudi进行注册。
Web Service是一个平台独立的、松耦合的、自包含的、基于可编程的Web的应用程序,可使用开放的XML标准描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
【注解】
1.3.1 Web Service是松耦合的软件模块:服务接口的定义中立,独立于任何底层平台、操作系统以及实现服务所使用的编程语言
1.3.2 Web Service语义封装各个独立的功能:Web Service是一个完成单个任务的自包含的软件模块
1.3.3 编程式访问Web Service:可将Web Service嵌入到远程的应用中,因此可以查询和更新信息,从而提高了效率、响应性和精确性
1.3.4 可动态发现Web Service并将其添加到应用中:可对多个Web Service进行装配,从而实现某个特定的功能、解决一个具体的问题或者向客户提供一个特定的解决方案
1.3.5 可使用标准的描述语言描述Web Service:Web Service描述语言(WSDL)既能描述功能性服务特性也能描述非功能性服务特性。功能性特性包含定义Web Service整体表现的操作特性。非功能性特性主要描述所在环境的特性
1.3.6 可在整个因特网上发布Web Service
1.4 优点
允许在不同平台上以不同语言编写的各种应用程序以基于标准的方式相互通信。
1.5 WebService技术
WebService技术是一种基于标准的Web协议的可编程组件,Web服务开放一系列的API,开放人员通过调用这些API来集成Web服务,构建自己的应用程序。
1.6 Web Service的特性
1.6.1 Web Service的类型
二、WebService的应用场景
2.1 SOAP
简单对象访问协议,是在分散或分布式环境中交换信息的简单协议,它基于XML协议,以XML形式提供了一个简单且轻量的用于在分散式或分布式环境下交换结构化或类型信息的机制,其本身并没有定义任何应用程序语义,而是通过提供一个有标准组件的包模型和在模块中编码数据的机制定义了一个简单的表示应用程序语义的机制,使其能够用于从信息传递到RPC的各种系统。
2.2 WSDL
Web Service描述语言,用于介绍你的Web Service的功能以及函数调用时的参数,可被机器识别和阅读的文档。
2.3 UUDI
UUDI,通用发现、说明和集成,是Web服务的黄页。是一套基于Web的、分布式地为Web Service提供信息注册中心的实现标准,同时包含一组能使企业将自身提供的Web Sercvice注册使得别的企业能够发现的访问协议。
2.4 上述三者的关系
SOAP是WebService的通信协议,WSDL是用于说明WebService的,UUDI是用来说明如何查找WebService的。
三、Web Service项目应用
3.1 Web Service的文件
1)Web Service是一个以.asmx为扩展名的文本文件
2)文本文件中必须包含@WebService指令,用作声明
3.2 步骤
3.2.1 新建项目
默认情况下,打开该文件,会有一个简单的示例,接下来我们可以实现自己的业务代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace MusciWebService
{
/// <summary>
/// WebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
}
2.2 运行项目(F5)
返回的结果:一段xml代码,客户端应用程序可以通过对xml的处理,解析其中的数据
四、Web Service属性介绍
4.1 命名空间(Namespace)
每个Web Service都需要唯一的命名空间,可使客户端应用程序区分出可能使用相同方法名称的Web Service。 尽管命名空间类似于典型的 URL,但在 Web 浏览器中是不能查看的, 它只是一个唯一标识符。
4.2 Description
此属性的值包含描述性消息。
4.3 Name
此属性的值包含 XML Web Service 的名称。
4.4 WebMethod(Web服务方法)的6个属性
Description:是对 Web Service 方法的描述信息。
EnableSession:指示 Web Service 是否启动 Session 标志,主要通过 Cookie 完成, 默认为 false。
MessageName:主要实现方法重载后的重命名
TransactionOption:指示 Web Service 方法的事务支持
由于 HTTP 协议的无状态特性,Web Service 方法只能作为根对象参与事务。如果 COM 对象与 Web Service 方法参与相同的事务,并且在组件服务管理工具中被标记为在事务内运 行,则Web Service方法可以调用这些COM对象。如果一个TransactionOption属性为Required 或 RequiresNew 的 Web Service 方法调用另一个 TransactionOption 属性为 Required 或 RequiresNew 的 Web Service 方法,则每个 Web Service 方法将参与它们自己的事务,因为 Web Service 方法只能用做事务中的根对象。如果异常是从 Web 服务方法引发的或未被该方 法捕获,则自动放弃该事务。如果未发生异常,则自动提交该事务,除非该方法显式调用 SetAbort。
CacheDuration:设置响应应在缓存中保留的秒数。这样 Web Service 就不需要重复 执行多遍,可以提高访问效率,而 CacheDuration 就是指定缓存时间的属性。
BufferResponse:配置 Web Service 方法是否等到响应被完全缓冲完才发送信息给请 求端。普通应用要等完全被缓冲完才被发送。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace MusciWebService
{
/// <summary>
/// WebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/",Description ="接口的描述性说明文字",Name ="MusicWebService")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
public static int i = 0;
[WebMethod(Description ="对WebService方法的描述信息")]
public string GetMusicGategory(string gategory)
{
//业务代码,此时暂时省略
return "15";
}
//[WebMethod(MessageName = "GetMusicGategory1")]
//public string GetMusicGategory()
//{
// //业务代码,获取所有种类
// return "260";
//}
[WebMethod(EnableSession =true,CacheDuration =30)]
public int Count()
{
i = i + 1;
return i;
}
}
}
五、ASP.NET如何调用Web Service
5.1 创建ASP.NET WEB项目,添加服务引用
1)如果是本解决方案中的 Web 服务,则选第一个,程序会自动转向解决方案中的服 务地址。
2)如果是本计算机上的 Web 服务,则系统会自动寻找本机的 Web 服务,供你选择。
3)无论哪种情况,其最终目标都是在 URL 处输入相应的地址,进行加载,所以,我 们可以在 URL 中输入 Web 服务的地址,无论是本地还是公网的都一样。然后,单 击“前往”按钮,则会列出 Web 服务的测试页和方法描述,同时验证项目是否能 够使用 Web 服务
5.2 调用示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MusicApplication
{
public class MusicTest
{
public string GetCategory()
{
MusicReference1.MusicWebService service = new MusicReference1.MusicWebService();
string result = service.GetMusicGategory("1");
return result;
}
}
}
六、实现异步调用Web Service
异步调用 Web Service 第一种方法,是通过利用 Backgroundworker 对象实现。BackgroundWorker 类允许你在 单独的专用线程上运行操作。
第二种方法,是调用 Web Service 的 WebMethod 中的 Async 方法实现。当添加完 Web Service 的引用以后,会在本地生成代理类,其中,会有一个和原 Web Service 方法名字相同 而后缀是 Async 的方法。
七、如何保证Web Service的安全
确保访问的方式是否安全,可以从一下几个方面做安全措施:
1)谁访问——SoapHeader 身份认证
2)来自哪里——访问 IP 认证
3)加密传输 ——SSL 安全访问
7.1 通过 SoapHeader 来增强 Web Service 的安全性
1)Web Service 实现步骤---定义自己的 SoapHeader 派生类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
namespace MusciWebService
{
/// <summary>
/// 通过SoapHeader可以让具有指定用户口令的用户来访问我们的 Web 服务接口
/// 定义自己的SoapHeader 派生类
/// </summary>
public class MySoapHeader:System.Web.Services.Protocols.SoapHeader
{
private string _UserID = string.Empty;
private string _PassWord = string.Empty;
#region 属性
//<summary>
//用户名
//</summary>
public string UserID
{
get { return _UserID; }
set { _UserID = value; }
}
//<summary>
//加密后的密码
//</summary>
public string PassWord
{
get { return _PassWord; }
set { _PassWord = value; }
}
#endregion
/// <summary>
/// 构造函数
/// </summary>
public MySoapHeader()
{
}
public MySoapHeader(string nUserID,string nPassWord)
{
Initial(nUserID, nPassWord);
}
//<summary>
//初始化
//</summary>
//<param name="nUserID">用户ID</param>
//<param name="nPassWord">加密后的密码</param>
public void Initial(string username, string password)
{
UserID = username;
PassWord = password;
}
//<summary>
//验证用户名密码是否正确
//</summary>
//<param name="nUserID">用户ID</param>
//<param name="nPassWord">加密后的密码</param>
//<param name="nMsg">返回的错误信息</param>
//<returns>用户名密码是否正确</returns>
private bool IsValid(string nUserID, string nPassWord, out string nMsg)
{
nMsg = "";
try
{
//判断用户名密码是否正确
if (nUserID == "admin" && nPassWord == "admin")
{
return true;
}
else
{
nMsg = "对不起,你无权调用此Web 服务。";
return false;
}
}
catch
{
nMsg = "对不起,你无权调用此Web 服务。";
return false;
}
}
//<summary>
//验证用户名密码是否正确
//</summary>
//<returns>用户名密码是否正确</returns>
public bool IsValid(out string nMsg)
{
return IsValid(_UserID, _PassWord, out nMsg);
}
}
}
2)Web Service 实现步骤---添加基于 SoapHeader 验证的 Web Service 接口方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
namespace MusciWebService
{
/// <summary>
/// WebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/",Description ="接口的描述性说明文字",Name ="MusicWebService")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
public static int i = 0;
public MySoapHeader myHeader = new MySoapHeader();
//需要SoapHeader 验证
[SoapHeader("myHeader")]
[WebMethod(Description ="对WebService方法的描述信息")]
public string GetMusicGategory(string gategory)
{
string msg = "";
//验证是否有权访问
if(!myHeader.IsValid(out msg))
{
return msg;
}
//业务代码,此时暂时省略
return "15";
}
//[WebMethod(MessageName = "GetMusicGategory1")]
//public string GetMusicGategory()
//{
// //业务代码,获取所有种类
// return "260";
//}
[WebMethod(EnableSession =true,CacheDuration =30)]
public int Count()
{
i = i + 1;
return i;
}
}
}
3)Web Service 实现步骤---客户端调用具有 SoapHeader 的 Web Service
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MusicApplication
{
public class MusicTest
{
public string GetCategory()
{
WebService1.MusicWebService service = new WebService1.MusicWebService();
WebService1.MySoapHeader mySoapHeader = new WebService1.MySoapHeader();
mySoapHeader.PassWord = "admin";
mySoapHeader.UserID = "admin";
service.MySoapHeaderValue = mySoapHeader;
string result = service.GetMusicGategory("1");
return result;
}
}
}
7.2 采用 SSL 实现加密传输
默认情况下,IIS 使用 HTTP 协议以明文形式传输数据,Web Service 就是使用 HTTP 协议进行数据传输的。Web Service 传输的数据是 XML 格式的明文。
SSL(Security Socket Layer)的中文全称是加密套接字协议层,它位于 HTTP 协议层和TCP 协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安全性,同时 SSL 安全机制是依靠数字证书来实现的。SSL 基于公用密钥和私人密钥,用户使用公用密钥来加密数据,但解密数据必须使用相 应的私人密钥。使用 SSL 安全机制的通信过程如下:用户与 IIS 服务器建立连接后,服务器 会把数字证书与公用密钥发送给用户,用户端生成会话密钥,并用公共密钥对会话密钥进行 加密,然后传递给服务器,服务器端用私人密钥进行解密,这样,用户端和服务器端就建立 了一条安全通道,只有 SSL 允许的用户才能与 IIS 服务器进行通信。
SSL 网站不同于一般的 Web 站点,它使用的是“HTTPS”协议,而不是普 通的“HTTP”协议。因此它的 URL(统一资源定位器)格式为“https://网站 域名”
1)步骤---为服务器安装证书服务
control--->添加或删除程序--->windows组件--->勾选证书--->选择独立根CA--->指定证书数据库和证书数据库日志的位置
2)步骤---配置 SSL 网站
7.3 访问 IP 限制
在具体 Web 方法里调用该方法检查用户访问者是否是以我们允许的 IP 进行访问的,以 确保安全。 IP 是可以伪造的;维护 IP 地址表比较烦琐。且只适合于固定 IP 访问者的情况。