1. WebService
Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。
是通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键)。
XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
1.1. 创建
新建一个空的ASP.NET项目作为WebService项目,在项目上右键,新建项,选择【Web服务(ASMX)】,如下:
在刚添加的asmx文件上右键,选择【在浏览器中查看】,
浏览器中呈现 WebMethod HelloWorld,即表明服务新建成功:
1.2. WebMethod
新增一个WebMethod,在浏览器中查看或者发布均可,代码如下:
/// <summary>
/// TestWebService 的摘要说明
/// </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 TestWebService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
public Student PostData(string name, string pwd)
{
return new Student() { Name = name, Pwd = pwd };
}
}
public class Student
{
public string Name { get; set; }
public string Pwd { get; set; }
}
页面直接调用效果如下显示:
1.3. 在ASP.NET程序中调用WebService
针对前面小节中已经部署的WebService的调用为例,我们在ASP.NET应用程序中添加服务引用,在项目引用上右键添加服务引用,
在【添加服务引用】窗口内点击【发现】按钮,寻找项目中存在的WebService,命名空间可以修改也可以选择默认,如下:
引用成功后,会新增服务引用,如下:
对应的调用代码:
//服务代理类
TestServiceReference.TestWebServiceSoapClient srv = new TestServiceReference.TestWebServiceSoapClient();
var res = srv.PostData("jack", "admin");
不跨域的话,还可以通过jquery ajax进行调用,项目结构和代码如下:
$.ajax({
//注意跨域问题,不要进行跨域访问
url: "/testwebservice.asmx/PostData",
dataType: "json",
type: "post",
//request contentType必须指明是json格式,否则服务端不知道客户端期望json格式
contentType: "application/json; charset=utf-8",
//由于request contentType指明为json的关系,传参必须以json字符串的形式传递,而不是通常所写的js对象
data: '{ "name": "杰克马","pwd":"123123" }',
success: function (data) {
debugger;
},
error: function (err) { }
});
也可以添加 免费WebService接口的引用,以添加天气预报为示例:
添加服务引用窗口选择【高级】选项,然后选择【添加Web引用】,如图所示:
粘贴免费WebService地址确定,添加引用即可:
完成引用后,即自动创建文件夹【Web References】及对应的web服务:
调用也很简单,如下:
cn.com.webxml.www.WeatherWebService srv = new cn.com.webxml.www.WeatherWebService();
var cityWeather = srv.getWeatherbyCityName("芜湖");
1.4. SOAP
SOAP(Simple Object Access Protocol )简单对象访问协议,它是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:
- 封装:封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架
- 编码规则:用于表示应用程序需要使用的数据类型的实例
- RPC表示:表示远程过程调用和应答的协定
- SOAP绑定:使用底层协议交换信息。
1.4.1. 使用SOAP头自定义身份验证
身份验证和授权是控制用户访问所有Web应用程序时的两道安全机制,第一道是如何标识身份,第二道是如何分配权限。
这里,我们来着重讨论一下在ASP.NET Web服务框架中如何实现身份验证机制。
在ASP.NET Web服务框架中,常见的身份验证的类型有三种:
- IIS身份验证
- ASP.NET身份验证
- 自定义SOAP头身份验证
我们使用自定义头身份验证实现一个简单的身份验证功能,添加验证处理类 【SoapHeaderHelper.cs】,项目结构和代码如下:
/// <summary>
/// 自定义SOAP头
/// </summary>
public class SoapHeaderHelper : SoapHeader
{
public string UserID { get; set; }
public string UserPwd { get; set; }
/// <summary>
/// 简单验证消息
/// out 参数 传递的不是副本,而是对象的引用
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool IsValid(out string msg)
{
if (UserID != "admin" || UserPwd != "admin")
{
msg = "无权访问";
return false;
}
msg = string.Empty;
return true;
}
}
在需要验证的服务添加特性【SoapHeader】标签,指定验证的实例,如下:
/// <summary>
/// TestWebService 的摘要说明
/// </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 TestWebService : System.Web.Services.WebService
{
/// <summary>
/// 简单验证实例 必须为public
/// </summary>
public SoapHeaderHelper simpleValid = new SoapHeaderHelper();
/// <summary>
/// 根据编号查询图书信息
/// 使用特性 [SoapHeader("simpleValid")] 进行简单验证
/// </summary>
/// <param name="bookID"></param>
/// <returns></returns>
[WebMethod(Description = "根据编号查询图书信息")]
[SoapHeader("simpleValid")]
public Book QueryBook(int bookID)
{
string msg = string.Empty;
if (!simpleValid.IsValid(out msg))
{
return new Book() { Name = msg, Author = msg };
}
if (bookID == 1)
{
return new Book() { Name = "C#编程基础", Author = "张三" };
}
if (bookID == 2)
{
return new Book() { Name = "JAVA编程基础", Author = "李四" };
}
return new Book() { Name = "未知", Author = "未知" };
}
}
/// <summary>
/// 图书类
/// </summary>
public class Book
{
public string Name { get; set; }
public string Author { get; set; }
}
在ASP.NET应用程序调用处,更新服务引用后,调用时添加验证信息,如下:
//服务代理
TestServiceReference.TestWebServiceSoapClient srv = new TestServiceReference.TestWebServiceSoapClient();
//验证对象
TestServiceReference.SoapHeaderHelper valid = new TestServiceReference.SoapHeaderHelper();
valid.UserID = "admin";
valid.UserPwd = "admin";
var res = srv.QueryBook(valid, 1);
参考引用: