最近在准备明年初的跳槽季,于是就想总结一下关于SOA的一些东西,今天就开始第一篇关于.Net中WebService的总结吧。
首先先来了解一下关于SOA的一些概念。面向服务架构,它是构造分布式系统的方法论,同时也提供了一些标准和工具。它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。
WebService是.Net Framework 2.0推出的一项技术,在此之前也有 Remoting来实现SOA的方式,但本人未曾接触过Remoting,所以不做介绍。
我们知道,WebService必须寄宿在IIS中运行,所以其采用Http协议作为传输协议。接下来看一下关于WebService的几个重要概念。
- Http传输信道,决定数据在服务器之间是什么格式传递的
- XML的数据格式,通过Http传输解析得到的有用数据
- SOAP协议,简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。
- WSDL:Web服务描述语言,是为描述Web服务发布的XML格式,属于webservice的标配
- UDDI:是一种用于描述、发现、集成Web Service的技术,它是Web Service协议栈的一个重要部分。通过UDDI,企业可以根据自己的需要动态查找并使用Web服务,也可以将自己的Web服务动态地发布到UDDI注册中心,供其他用户使用。
了解了一些概念性的东西之后,我想关于如何使用VS创建一个WebService项目也不用做多介绍了,这里只需要记住其以.asmx为后缀,集成System.Web.Services.WebService,并且使用特性WebService标记类,WebMethod标记服务方法就行了。而在调用端调用该WebService时只要在项目中添加服务引用即可,这一步骤VS会基于工具svcUtil.exe和WSDL生成一个代理,为我们屏蔽了服务调用的复杂性。
一般而言,我们将WebService用来做为公司内部各个系统之间的服务调用,在这个情况下一般也不需要去考虑权限相关的问题。但是有时候如果需要为外部应用提供服务,则需要重点考虑下权限。关于WebService的权限验证方式,可以采用
Form认证或windows认证 ,这中方式通过配置就可以完成。但实际开发中我们通常使用服务方法里面添加账号密码参数
或者添加SoapHeader来实现。下面我们就来看下如何使用SoapHeader方式来实现WebService的权限验证。
首先需要定义一个继承自System.Web.Services.Protocols.SoapHeader,然后在方法中添加特性SoapHeader,具体看下面代码的实现。
/// <summary> /// Header:分配个加密钥 账号密码加密 /// /// </summary> public class CustomSoapHeader : System.Web.Services.Protocols.SoapHeader { private string userName = string.Empty; private string passWord = string.Empty; public CustomSoapHeader()//必须有一个无参数的构造函数 { } /// <summary> /// 构造函数 /// </summary> /// <param name="userName">用户名</param> /// <param name="passWord">密码</param> public CustomSoapHeader(string userName, string passWord) { this.userName = userName; this.passWord = passWord; } /// <summary> /// 获取或设置用户用户名 /// </summary> public string UserName { get { return userName; } set { this.userName = value; } } /// <summary> /// 获取或设置用户密码 /// </summary> public string PassWord { get { return passWord; } set { this.passWord = value; } } public bool Validate() { return this.UserName.Contains("Eleven") && this.PassWord.Contains("123456"); } }
public class MyWebService : System.Web.Services.WebService { public CustomSoapHeader SoapHeaderProp { get; set; } [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public string HelloWorldWithAuth(string name_password) { if (true) { } return "Hello World"; } [WebMethod] public string GetName(int i) { return $"{i}加菲猫"; } [WebMethod]//webservice的方法就没有重载 public int Plus(int x, int y) { return x + y; } [WebMethod] [SoapHeader("SoapHeaderProp")] public string GetInfo(int id, string name) { if (!this.SoapHeaderProp.Validate()) { throw new SoapException("身份验证失败", SoapException.ClientFaultCode); } return Newtonsoft.Json.JsonConvert.SerializeObject(new { Id = id, Name = name, Remark = $"This is {id} {name}" }); } [WebMethod] [SoapHeader("SoapHeaderProp")] public UserInfo GetUser(int id) { if (!this.SoapHeaderProp.Validate()) { throw new SoapException("身份验证失败", SoapException.ClientFaultCode); } return new UserInfo() { Id = id, Name = "楠nan", Age = 27 }; }
using (MyWebServiceTest.MyWebServiceSoapClient client = new MyWebServiceTest.MyWebServiceSoapClient()) { MyWebServiceTest.CustomSoapHeader header = new MyWebServiceTest.CustomSoapHeader(); header.UserName = "Eleven"; header.PassWord = "123456"; int iResult = client.Plus(12, 33);//45 MyWebServiceTest.UserInfo userInfo = client.GetUser(header, 1); //List<MyWebServiceTest.UserInfo> userList = client.GetUserList(header); var userList = client.GetUserList(header); }