Asp.NetWebAPI 及相关技术介绍
ASP.NETWebAPI记录请求响应数据到日志的一个方法
WebAPI记录请求响应数据到⽇志的⼀个⽅法 Web API 记录请求响应数据到⽇志的⼀个⽅法REST风格的服务架构已经成为越来越多⼈的选择,之前我⽤过WCF来实现REST服务,WCF是⼀个很强⼤的框架,⼲这点⼩事有点太沉重的感觉。
后来微软⼜推出了⼀个,专门⽤来处理⼀些基本的Http服务,即灵活⼜简单,推荐⼤家都看看。
今天这篇⽂章是使⽤ Web API过程中的⼀个⼩经验,与⼤家分享。
后台服务通常需要记录⼀些运⾏记录,如输⼊输出、请求信息、处理过程、响应信息等,在以前记录请求数据和响应数据时,我经常在具体的接⼝⽅法中处理,如:///账户验证/// </summary>/// <param name="instance"></param>/// <returns></returns>public LoginResponse UserCheck(UserInfo instance){ LogHelper.LogRequest<UserInfo>(instance); var response = erLogin(instance); LogHelper.LogResponse<LoginResponse>(response); return response;}LogHelper.LogRequest ⽤于记录请求的数据,LogHelper.LogResponse⽤于记录返回的数据。
这样处理的话,每个⽅法中都要重复如此记录,不简洁,不⽅便,还处于复制代码的阶段。
⼀直想改变,去苦于没有思路。
某⼀天在博客园看到《》,如获⾄宝。
于是开始在Web API的⽣命周期中寻找可以截获到这些数据的点,最终在官⽹上找到⼀篇⽂章《》,参考其中的说明,我重新构造了记录输⼊输出的⽅法:/// <summary>///消息处理程序/// </summary>public class CustomMessageHandler : DelegatingHandler{ /// <summary> ///重写发送HTTP请求到内部处理程序的⽅法 /// </summary> /// <param name="request">请求信息</param> /// <param name="cancellationToken">取消操作的标记</param> /// <returns></returns> protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 记录请求内容 if (request.Content != null) { LogWriter.ToInfo(string.Format("请求Content:{0}", request.Content.ReadAsStringAsync().Result)); } // 发送HTTP请求到内部处理程序,在异步处理完成后记录响应内容 return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>( (task) => { // 记录响应内容 LogWriter.ToInfo(string.Format("响应Content:{0}", task.Result.Content.ReadAsStringAsync().Result)); return task.Result; } ); }}为了使消息处理进⼊我们⾃定义的消息处理程序,需要在Global.asax⽂件的Application_Start⽅法中,将CustomMessageHandler添加到MessageHandlers中:protected static void Configure(HttpConfiguration config){ config.MessageHandlers.Add(new CustomMessageHandler());}protected void Application_Start(object sender, EventArgs e){ Configure(GlobalConfiguration.Configuration);}DelegatingHandler使⽤委托模式,这样添加以后,程序就会执⾏CustomMessageHandler中重写的⽅法了。
webapi方法注释
webapi方法注释Web API是一种用于构建和提供Web服务的技术,它允许应用程序通过HTTP协议进行通信和交互。
在本文中,将介绍几种常用的WebAPI方法,并讨论它们的特点和用法。
1. GET方法:GET方法用于从服务器获取资源。
它是最常用的API 调用方法之一。
通过GET方法,应用程序可以从服务器获取数据,并将其展示给用户。
GET方法的特点是安全、幂等和无副作用。
安全是指该方法不会对服务器上的资源进行修改;幂等是指多次调用该方法所产生的效果与一次调用的效果相同;无副作用是指该方法不会对服务器和数据库产生任何影响。
GET方法通常用于获取资源的信息,比如读取博客文章的内容或获取用户的个人资料。
2. POST方法:POST方法用于向服务器提交数据。
通过POST方法,应用程序可以向服务器发送数据,并请求服务器执行某种操作。
与GET方法不同,POST方法具有副作用,即会对服务器上的资源进行修改。
POST方法的特点是非幂等和有副作用。
非幂等是指多次调用该方法所产生的效果与一次调用的效果不同;有副作用是指该方法会对服务器和数据库产生影响。
POST方法通常用于创建新资源或修改现有资源,比如发布新的博客文章或更新用户的个人资料。
3. PUT方法:PUT方法用于更新服务器上的资源。
通过PUT方法,应用程序可以向服务器发送要更新的数据,并请求服务器更新指定的资源。
PUT方法与POST方法类似,都具有副作用,但PUT方法是幂等的,即多次调用该方法所产生的效果与一次调用的效果相同。
PUT方法通常用于更新资源的全部内容,比如修改博客文章的标题或更新用户的密码。
4. PATCH方法:PATCH方法用于部分更新服务器上的资源。
通过PATCH方法,应用程序可以向服务器发送要更新的数据,并请求服务器部分更新指定的资源。
与PUT方法不同,PATCH方法只更新资源的部分内容,而不是替换整个资源。
PATCH方法的使用场景是在不影响其他属性的情况下,更新资源的某些属性。
asp.netcorewebapi统一处理返回值、异常和请求参数验证
corewebapi统⼀处理返回值、异常和请求参数验证现在的开发模式很少⽤ mvc⼀个项⽬直接操作界⾯和数据库了。
⼤部分都使⽤前后端分离,更多的是为了让API⽀持移动端。
后端写webapi的时候必然需要和前端约定请求值和返回值的格式,如果有异常返回应该如何识别和区分;通过actionfilter即可实现AOP切⼊处理,⽽不需要在每个⽅法中处理。
/// <summary>/// Api action统⼀处理过滤器/// 处理正常返回值 {code:200,body:{}}/// </summary>public class ApiResponseFilterAttribute : ActionFilterAttribute{public override void OnActionExecuting(ActionExecutingContext context){//模型验证if (!context.ModelState.IsValid){throw new ApplicationException(context.ModelState.Values.First(p => p.Errors.Count > 0).Errors[0].ErrorMessage);}base.OnActionExecuting(context);}/// <summary>/// 处理正常返回的结果对象,进⾏统⼀json格式包装/// 异常只能交由ExceptionFilterAttribute 去处理/// </summary>/// <param name="context"></param>public override void OnActionExecuted(ActionExecutedContext context){if (context.Result != null){var result = context.Result as ObjectResult;JsonResult newresult;if (context.Result is ObjectResult){newresult = new JsonResult(new { code = 200, body = result.Value });}else if (context.Result is EmptyResult){newresult = new JsonResult(new { code = 200, body = new { } });}else{throw new Exception($"未经处理的Result类型:{ context.Result.GetType().Name}");}context.Result = newresult;}base.OnActionExecuted(context);}}/// <summary>/// api异常统⼀处理过滤器/// 系统级别异常 500 应⽤级别异常501/// </summary>public class ApiExceptionFilterAttribute : ExceptionFilterAttribute{public override void OnException(ExceptionContext context){context.Result = BuildExceptionResult(context.Exception);base.OnException(context);}/// <summary>/// 包装处理异常格式/// </summary>/// <param name="ex"></param>/// <returns></returns>private JsonResult BuildExceptionResult(Exception ex){int code = 0;string message = "";string innerMessage = "";//应⽤程序业务级异常if (ex is ApplicationException){code = 501;message = ex.Message;}else{// exception 系统级别异常,不直接明⽂显⽰的code = 500;message = "发⽣系统级别异常";innerMessage = ex.Message;}if (ex.InnerException != null && ex.Message != ex.InnerException.Message) innerMessage += "," + ex.InnerException.Message;return new JsonResult(new { code, message, innerMessage });}}。
.net webapi项目实例代码
标题:.NET WebAPI项目实例代码一、背景介绍1.1 WebAPI的概念.NET WebAPI是一种基于框架的工具,用于构建HTTP服务,支持通过HTTP协议传输数据,可用于构建RESTful架构风格的服务。
二、建立WebAPI项目2.1 创建新的WebAPI项目在Visual Studio中,选择“新建项目”,然后选择“ Web应用程序”模板,命名为WebAPIExample。
2.2 配置路由打开WebApiConfig.cs文件,配置WebAPI的路由规则,可以通过MapHttpAttributeRoutes方法进行配置,也可以通过Route特性对控制器进行路由配置。
三、编写控制器3.1 创建控制器类在Controllers文件夹下新建一个名为ValuesController.cs的类,用于处理对资源的请求。
3.2 编写控制器方法编写Get、Post、Put和Delete等HTTP动词对应的方法,以处理客户端的请求,并返回相应的资源数据。
四、测试WebAPI4.1 使用Postman测试API在Postman中输入API的URL,并选择对应的HTTP动词,发送请求并查看返回的数据,验证API的功能是否正确。
4.2 测试WebAPI的异常处理可以模拟客户端发送错误的请求,例如无效的参数或无效的URL,验证WebAPI的异常处理机制是否能够正确捕获并处理异常。
五、部署WebAPI项目5.1 部署到IIS服务器将WebAPI项目部署到IIS服务器,配置应用程序池和站点,确保可以通过HTTP请求访问到WebAPI服务。
5.2 部署到Azure如果需要将WebAPI项目部署到Azure云评台,可以通过Visual Studio的发布功能,将WebAPI发布到Azure的App Service中,实现云端部署。
六、总结6.1 WebAPI的优势与应用场景总结WebAPI相对于传统的Web服务的优势,以及在实际项目中的应用场景。
基于.NetFramework4.0WebAPI开发(2):ASP.NETWebAPIs参。。。
基于.NetFramework4.0WebAPI开发(2):WebAPIs参。
概述: Web API 的好⽤使⽤过的都知道,没有复杂的配置⽂件,⼀个简单的ApiController加上需要的Action就能⼯作。
调⽤API过程中参数的传递是必须的,本节就来谈谈API使⽤过程中参数的传递⽅式。
各种参数传递⽅式的实现: Web API参数有两种传递⽅式,⼀种是请求时携带QueryString,Action中没有表中标注FromUri和FromBody属性且没有默认值的参数,Request请求时必需⼀QueryString的⽅式携带参数?A=&B=&C=1,及时没有值,也得传递,否则报404错误。
API 开发中的FromUriAttribute属性,主要是⽤来在GET请求中传递复杂对象,并且每个API可以含有多个此类型的参数,但每个复杂对象中的属性名不能相同,否则⽆法正确传值,除⾮两个参数的相同属性的属性值相同,不过此种⽅式传递有⼀定的局限性,就是url长度限制,变相的限定此种⽅式的参数数据量的⼤⼩。
另外⼀种传递⽅式就是请求Request的发送内容携带数据,对应API开发中的FromBodyAttribute属性,此种⽅式主要应对POST请求参数的传递,可以传递复杂的类型,包括数组,list等,但是每个API有且仅有⼀个这样的参数,如果有多个,就会报⽆法将多个参数绑定到请求的内容不多上,下⾯上代码,⼀种⼀种讲解:1. 简单类型传递 简单类型包括 int(decimal,long,float)、string(char)、bool、datetime、guid,主要就这⼏种模板: public TResult nameOfFunction([FromUrl]int i, [FromUrl]string s, ……)=> public TResult nameOfFunction(int i, string s, ……)但模板: public TResult nameOfFunction([FromUrl]ClassA a, [FromUrl]Class b, ……)≠> public TResult nameOfFunction(ClassA a, ClassB b, ……)1 [HttpGet]2public ResultData TestParameter(int i, string s, bool b, DateTime t, Guid g)3 {4try5 {6var data = new { i = i, s = s, b = b, t = t, g = g};7return new ResultData(data);8 }9catch (Exception ex)10 {11throw ex;12//return new ResultData(ResultType.SystemException, ex.Message);13 }14 }1516//TestParameter17 function TestParameter() {18var v = { i: 1, b: false, t: "2016-07-06", g: "E816F0B7-2FB7-47D9-84ED-119F58C9BEC5", s: "test"};19 $.ajax({20 type: "get",21 url: host + "/mobileapi/test/TestParameter",22 dataType: "text",23 data: v,24 success: function (data) {25 alert(data);26 },27 error: function (x, y, z) {28 alert("报错⽆语");29 }30 });31 }结果如下:注意:1. GET 类型请求的API不能含有[FromBody]属性的参数,虽然不会报错,但永远没为null,如果GET请求需要传递复杂参数,可以⽤FromUri 属性修饰参数2. API参数没有默认值的情况下,请求的参数名称必需与API参数名称保持⼀致,但不区分⼤⼩写,且能对应上的参数个数⼀定相等,否则会报404错误。
WebAPI的开发和接口管理技术
WebAPI的开发和接口管理技术随着互联网的普及和移动应用的兴起,WebAPI成为了很多互联网公司必备的技术之一。
WebAPI(Application Programming Interface)是一种用于开发Web应用程序的软件接口,用于实现不同应用之间的数据交互和通信。
目前,很多互联网公司都在开发并使用自己的WebAPI,例如阿里巴巴的OpenAPI、百度的APIStore等等。
本文将围绕WebAPI的开发和接口管理技术展开,探讨如何开发高质量的WebAPI并管理好API接口。
一、WebAPI的开发技术WebAPI的开发技术包括后端语言、框架、数据库等方面。
下面我们分别来讨论这些方面的技术。
1、后端语言目前,常用的后端语言包括Java、PHP、Python、Ruby等。
选择哪种语言取决于公司的技术栈和开发人员的技术能力。
其中,Java是一种成熟、稳定、高效的编程语言,很多大型企业喜欢选择Java进行后端开发。
2、框架WebAPI的开发可以采用各种框架,例如Spring、Django、Flask等。
这些框架都可以快速搭建Web应用程序,提供丰富的组件和功能,同时也支持各种数据库。
3、数据库WebAPI的数据存储通常采用关系型数据库或非关系型数据库。
关系型数据库有MySQL、Oracle、SQL Server等,非关系型数据库有MongoDB、Redis等。
选择哪种数据库取决于数据量和数据类型。
二、WebAPI的接口管理技术开发好WebAPI并不意味着完成了一切,接下来的接口管理也非常重要。
接口管理包括接口文档编写、接口测试、接口监控等方面。
1、接口文档编写接口文档是WebAPI的重要组成部分,它通常由API说明文档和API测试文档两部分组成。
在编写API说明文档时,需要描述每个接口的功能、请求参数、返回参数等,使得其他开发人员可以清楚地了解每个接口的作用。
在编写API测试文档时,需描述如何使用Postman等工具进行接口测试,以保证接口的准确性。
Asp.netWebApi项目示例(增删改查)
WebApi项⽬⽰例(增删改查)1.WebApi是什么 Web API 是⼀种框架,⽤于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务。
Web API 是⼀种⽤于在 .NET Framework 上构建 RESTful 应⽤程序的理想平台。
可以把WebApi看成项⽬类型中的⼀种,其他项⽬类型诸如我们熟知的WebForm项⽬,Windows窗体项⽬,控制台应⽤程序等。
WebApi类型项⽬的最⼤优势就是,开发者再也不⽤担⼼客户端和服务器之间传输的数据的序列化和反序列化问题,因为WebApi是强类型的,可以⾃动进⾏序列化和反序列化,⼀会⼉项⽬中会见到。
下⾯我们建⽴了⼀个WebApi类型的项⽬,项⽬中对产品Product进⾏增删改查,Product的数据存放在List<>列表(即内存)中。
2.页⾯运⾏效果如图所⽰,可以添加⼀条记录; 输⼊记录的Id,查询出该记录的其它信息;修改该Id的记录;删除该Id的记录。
3.⼆话不说,开始建项⽬1)新建⼀个“ MVC 4 Web 应⽤程序”项⽬,命名为“ProductStore”,点击确定,如图2)选择模板“Web API”,点击确定,如图3)和MVC类型的项⽬相似,构建程序的过程是先建⽴数据模型(Model)⽤于存取数据, 再建⽴控制器层(Controller)⽤于处理发来的Http请求,最后构造显⽰层(View)⽤于接收⽤户的输⼊和⽤户进⾏直接交互。
这⾥我们先在Models⽂件夹中建⽴产品Product类: Product.cs,如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace ProductStore.Models{public class Product{public int Id { get; set; }public string Name { get; set; }public string Category { get; set; }public decimal Price { get; set; }}}4)试想,我们⽬前只有⼀个Product类型的对象,我们要编写⼀个类对其实现增删改查,以后我们可能会增加其他的类型的对象,再需要编写⼀个对新类型的对象进⾏增删改查的类,为了便于拓展和调⽤,我们在Product之上构造⼀个接⼝,使这个接⼝约定增删改查的⽅法名称和参数,所以我们在Models⽂件夹中新建⼀个接⼝: IProductRepository.cs ,如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ProductStore.Models{interface IProductRepository{IEnumerable<Product> GetAll();Product Get(int id);Product Add(Product item);void Remove(int id);bool Update(Product item);}}5)然后,我们实现这个接⼝,在Models⽂件夹中新建⼀个类,具体针对Product类型的对象进⾏增删改查存取数据,并在该类的构造⽅法中,向List<Product>列表中存⼊⼏条数据,这个类叫:ProductRepository.cs,如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace ProductStore.Models{public class ProductRepository:IProductRepository{private List<Product> products = new List<Product>();private int _nextId = 1;public ProductRepository(){Add(new Product { Name="Tomato soup",Category="Groceries",Price=1.39M});Add(new Product { Name="Yo-yo",Category="Toys",Price=3.75M});Add(new Product { Name = "Hammer", Category = "Hardware", Price = 16.99M });}public IEnumerable<Product> GetAll(){return products;}public Product Get(int id){return products.Find(p=>p.Id==id);}public Product Add(Product item){if (item == null){throw new ArgumentNullException("item");}item.Id = _nextId++;products.Add(item);return item;}public void Remove(int id){products.RemoveAll(p=>p.Id==id);}public bool Update(Product item){if (item == null){throw new ArgumentNullException("item");}int index = products.FindIndex(p=>p.Id==item.Id);if (index == -1){return false;}products.RemoveAt(index);products.Add(item);return true;}}}此时,Model层就构建好了。
ASP.NETCoreWebAPI教程-ProjectConfiguration
Core 应用程序本质是一个控制台应用程序,它通过创建 web 服务器来托管应用程序并监听传入的HTTP请求,然后返回响应,所 以程序的入口还是 Program 类的 Main() 方法, Core Web API 应用程序中的 Program 如下:
"CompanyEmployees": { "commandName": "Project", "launchBrowser": true, "launchUrl": "weatherforecast", "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }
public class Program {
public static void Main(string[] args) {
CreateHostBuilder(args).Build().Run(); }
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { eStartup<Startup>(); });
public class Startup {
手把手教你AspNetCoreWebApi认证与授权的方法
⼿把⼿教你AspNetCoreWebApi认证与授权的⽅法前⾔这⼏天⼩明⼜有烦恼了,之前给⼩红的接⼝没有做认证授权,直接裸奔在线上,被马⽼板发现后狠狠的骂了⼀顿,赶紧让⼩明把授权加上。
赶紧Baidu⼀下,发现⼤家都在⽤JWT认证授权,这个倒是挺适合⾃⼰的。
什么是TokenToken是服务端⽣成的⼀串字符串,以作客户端进⾏请求的⼀个令牌,当第⼀次登录后,服务器⽣成⼀个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,⽆需再次带上⽤户名和密码。
什么是JWTJson web token (JWT),是为了在⽹络应⽤环境间传递声明⽽执⾏的⼀种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适⽤于分布式站点的单点登录(SSO)场景。
JWT的声明⼀般被⽤来在⾝份提供者和服务提供者间传递被认证的⽤户⾝份信息,以便于从资源服务器获取资源,也可以增加⼀些额外的其它业务逻辑所必须的声明信息,该token也可直接被⽤于认证,也可被加密。
JWT认证流程从图中可以看出主要有两部分组成:1、获取Token,2、通过Token进⾏授权。
使⽤JWT认证⾸先,安装JwtBearer包。
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer --version 3.1.0接下来,定义⼀个配置类,我这⾥为了简单直接⽤常量代替了,你也可以放在配置⽂件中。
public class TokenParameter{public const string Issuer = "深度码农";//颁发者public const string Audience = "深度码农";//接收者public const string Secret = "1234567812345678";//签名秘钥public const int AccessExpiration = 30;//AccessToken过期时间(分钟)}接下来,定义⼀个通过⽤户名和密码,获取Token的控制器。
webapi 讲解
webapi 讲解Web API(Application Programming Interface)是一种用于不同应用程序之间进行通信的技术。
它允许开发人员通过定义的接口,以统一的方式访问和操作远程服务器上的资源。
本文将围绕Web API展开讨论,从其基本概念、工作原理、应用场景和未来发展等方面进行介绍。
一、Web API的基本概念Web API是一种软件接口,它使用HTTP协议作为通信协议,通过URL(Uniform Resource Locator)来定位和访问资源。
它可以提供各种服务,如数据查询、数据修改、文件上传和下载等。
Web API 基于REST(Representational State Transfer)架构风格,以资源为中心,使用HTTP方法(GET、POST、PUT、DELETE)来进行操作。
二、Web API的工作原理Web API的工作原理可以简单描述为以下几个步骤:1. 客户端通过HTTP请求访问Web API,包括指定资源的URL和请求方法。
2. 服务器接收到请求后,根据URL和请求方法,调用相应的API方法。
3. API方法对请求进行处理,可能涉及数据查询、数据更新等操作。
4. 处理完请求后,服务器将结果封装成HTTP响应返回给客户端。
三、Web API的应用场景Web API在互联网应用开发中有广泛的应用场景,例如:1. 移动应用开发:移动应用可以通过Web API访问远程服务器上的数据,实现数据的同步和共享。
2. 第三方集成:Web API可以提供给第三方开发者使用,使其能够与自己的应用进行集成,实现更多功能和服务。
3. 数据开放:Web API可以将内部数据开放给外部开发者使用,促进数据共享和创新。
4. 服务器通信:不同服务之间可以通过Web API进行通信,实现数据的交互和共享。
四、Web API的未来发展随着互联网的快速发展和应用需求的不断增加,Web API的重要性日益凸显。
.net api常用架构
在.NET中,有几种常用的API架构:
Core MVC: Core MVC是一种基于MVC架构的Web API 框架,它使用模型、视图和控制器来构建应用程序。
Core MVC具有高性能、灵活性、可扩展性和可测试性等特点。
Web API: Web API是一个用于构建RESTful API的框架,它基于 Framework,并使用HttpController类来定义API端点。
Web API 可以与MVC共享代码库和控制器,但主要用于提供数据和功能服务。
OData(Open Data Protocol):OData是一种标准化的数据格式和协议,用于构建RESTful API。
它使得数据可以以可查询和可操作的方式公开,并支持通过HTTP、JSON和XML等格式进行通信。
gRPC(gRPC Remote Procedure Call):gRPC是一个高性能、开源、通用的远程过程调用(RPC)框架,基于HTTP/2协议。
它支持多种编程语言,包括C#、Java、Python等。
gRPC具有高扩展性、高可用性和低延迟等特点。
GraphQL:GraphQL是一种用于API的查询语言和运行时环境,它允许客户端精确地指定需要的数据,并且仅返回所需的结果。
GraphQL提供了强大的类型系统和查询能力,可以提高API的性能和用户体验。
以上是一些常用的.NET API架构,每种架构都有其特点和适用场景。
根据项目的需求和目标选择合适的架构可以获得更好的性能和可维护性。
asp.netwebapiswagger使用总结
webapiswagger使⽤总结⽹上资料⽐较多但是很零散我从新整理⼀份希望可以帮到需要的朋友1.配置安装后⾃动⽣成SwaggerConfig1.1 右键项⽬→属性→⽣成→选中下⽅的 "XML⽂档⽂件" 然后保存这⾥要注意在⾥⾯我们⼀般会把数据层建多⼀个项⽬,那对应项⽬也要打勾⽣成XML⽂件然后在SwaggerConfig配置public static void Register(){var thisAssembly = typeof(SwaggerConfig).Assembly;//获取项⽬⽂件路径var baseDirectory = string.Format("{0}bin", System.Web.HttpRuntime.AppDomainAppPath);var commentsFileName = Assembly.GetExecutingAssembly().GetName().Name + ".XML";var commentsFile = bine(baseDirectory, commentsFileName);var commentsFileName2 = "Web.Framework" + ".XML";var commentsFile2 = bine(baseDirectory, commentsFileName2);GlobalConfiguration.Configuration.EnableSwagger(c =>{//⽤于启⽤和设置Swagger的配置信息。
c.SingleApiVersion("v2", "API");//单个xml⽂件注释读取c.IncludeXmlComments(commentsFile);c.IncludeXmlComments(commentsFile2);//swagger注释配置c.CustomProvider((defaultProvider) => new SwaggerCacheProvider(defaultProvider, commentsFileName));}).EnableSwaggerUi(c =>{//⽤于启⽤UI界⾯。
ASP.NETCoreWebAPI下事件驱动型架构的实现(一):一个简单的实现
CoreWebAPI下事件驱动型架构的实现(⼀):⼀个简单的实现很长⼀段时间以来,我都在思考如何在 Core的框架下,实现⼀套完整的事件驱动型架构。
这个问题看上去有点⼤,其实主要⽬标是为了实现⼀个基于 Core的微服务,它能够⾮常简单地订阅来⾃于某个渠道的事件消息,并对接收到的消息进⾏处理,于此同时,它还能够向该渠道发送事件消息,以便订阅该事件消息的消费者能够对消息数据做进⼀步处理。
让我们回顾⼀下微服务之间通信的⼏种⽅式,分为同步和异步两种。
同步通信最常见的就是RESTful API,⽽且⾮常简单轻量,⼀个Request/Response回环就结束了;异步通信最常见的就是通过消息渠道,将载有特殊意义的数据的事件消息发送到消息渠道,⽽对某种类型消息感兴趣的消费者,就可以获取消息中所带信息并执⾏相应操作,这也是我们⽐较熟知的事件驱动架构的⼀种表现形式。
虽然事件驱动型架构看起来⾮常复杂,从微服务的实现来看显得有些繁重,但它的应⽤范围确实很⼴,也为服务间通信提供了新的思路。
了解DDD的朋友相信⼀定知道CQRS体系结构模式,它就是⼀种事件驱动型架构。
事实上,实现⼀套完整的、安全的、稳定的、正确的事件驱动架构并不简单,由于异步特性带来的⼀致性问题会⾮常棘⼿,甚⾄需要借助⼀些基础结构层⼯具(⽐如关系型数据库,不错!只能是关系型数据库)来解决⼀些特殊问题。
本⽂就打算带领⼤家⼀起探探路,基于 Core Web API实现⼀个相对⽐较简单的事件驱动架构,然后引出⼀些有待深⼊思考的问题,留在今后的⽂章中继续讨论。
或许,本⽂所引⼊的源代码⽆法直接⽤于⽣产环境,但我希望本⽂介绍的内容能够给到读者⼀些启发,并能够帮助解决实际中遇到的问题。
术语约定本⽂会涉及⼀些相关的专业术语,在此先作约定:事件:在某⼀特定时刻发⽣在某件事物上的⼀件事情,例如:在我撰写本⽂的时候,电话铃响了消息:承载事件数据的实体。
事件的序列化/反序列化和传输都以消息的形式进⾏消息通信渠道:⼀种带有消息路由功能的数据传输机制,⽤以在消息的派发器和订阅器之间进⾏数据传输注意:为了迎合描述的需要,在下⽂中可能会混⽤事件和消息两个概念。
asp.netmvcwebapi实用的接口加密方法
mvcwebapi实⽤的接⼝加密⽅法在很多项⽬中,因为webapi是对外开放的,这个时候,我们就要得考虑接⼝交换数据的安全性。
安全机制也⽐较多,如andriod与webapi 交换数据的时候,可以⾛双向证书⽅法,但是开发成本⽐较⼤,今天我们不打算介绍这⽅⾯的知识,我们说说⼀个较简单也较常见的安全交换机制在这⾥要提醒读者,⽬前所有的加密机制都不是绝对的安全!我们的⽬标是,任何⽤户或者软件获取到我们的webapi接⼝url后⽤来再次访问该地址都是⽆效的!达到这种⽬标的话,我们必须要在url中增加⼀个时间戳,但是仅仅如此还是不够,⽤户可以修改我们的时间戳!因此我们可以对时间戳进⾏MD5加密,但是这样依然不够,⽤户可以直接对我们的时间戳md5的哦,因些需要引⼊⼀个绝对安全的双⽅约定的key,并同时加⼊其它参数进⾏混淆!注意:这个key要在app⾥和我们的webapi⾥各保存相同的⼀份!于是我们约定公式:加密结果=md5(时间戳+随机数+key+post或者get的参数)下⾯我们开始通过上述公式写代码:于由我的环境是 mvc 的,所以重写⼀个加密类ApiSecurityFilter1、获取参数if (request.Headers.Contains("timestamp"))timestamp = HttpUtility.UrlDecode(request.Headers.GetValues("timestamp").FirstOrDefault());if (request.Headers.Contains("nonce"))nonce = HttpUtility.UrlDecode(request.Headers.GetValues("nonce").FirstOrDefault());if (request.Headers.Contains("signature"))signature = HttpUtility.UrlDecode(request.Headers.GetValues("signature").FirstOrDefault());if (string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(nonce) || string.IsNullOrEmpty(signature))throw new SecurityException();2、判断时间戳是否超过指定时间double ts = 0;bool timespanvalidate = double.TryParse(timestamp, out ts);bool falg = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds - ts > 60 * 1000;if (falg || (!timespanvalidate))throw new SecurityException();3、POST/DELETE/UPDATE 三种⽅式提取参数case"POST":case"PUT":case"DELETE":Stream stream = HttpContext.Current.Request.InputStream;StreamReader streamReader = new StreamReader(stream);sortedParams = new SortedDictionary<string, string>(new JsonSerializer().Deserialize<Dictionary<string, string>>(new JsonTextReader(streamReader)));break;4、GET ⽅式提取参数case"GET":IDictionary<string, string> parameters = new Dictionary<string, string>();foreach (string key in HttpContext.Current.Request.QueryString){if (!string.IsNullOrEmpty(key)){parameters.Add(key, HttpContext.Current.Request.QueryString[key]);}}sortedParams = new SortedDictionary<string, string>(parameters);break;5、排序上述参数并拼接,形成我们要参与md5的约定公式中的第四个参数StringBuilder query = new StringBuilder();if (sortedParams != null){foreach (var sort in sortedParams.OrderBy(k => k.Key)){if (!string.IsNullOrEmpty(sort.Key)){query.Append(sort.Key).Append(sort.Value);}}data = query.ToString().Replace("", "");}6、开始约定公式计算结果并对⽐传过的结果是否⼀致var md5Staff = Seedwork.Utils.CharHelper.MD5(string.Concat(timestamp + nonce + staffId + data), 32);if (!md5Staff.Equals(signature))throw new SecurityException();完整的代码如下:1public class ApiSecurityFilter : ActionFilterAttribute2 {3public override void OnActionExecuting(HttpActionContext actionContext)4 {5var request = actionContext.Request;67var method = request.Method.Method;8var staffId = "^***********************************$";910string timestamp = string.Empty, nonce = string.Empty, signature = string.Empty;1112if (request.Headers.Contains("timestamp"))13 timestamp = request.Headers.GetValues("timestamp").FirstOrDefault();1415if (request.Headers.Contains("nonce"))16 nonce = request.Headers.GetValues("nonce").FirstOrDefault();1718if (request.Headers.Contains("signature"))19 signature = request.Headers.GetValues("signature").FirstOrDefault();2021if (string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(nonce) || string.IsNullOrEmpty(signature))22throw new SecurityException();2324double ts = 0;25bool timespanvalidate = double.TryParse(timestamp, out ts);2627bool falg = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds - ts > 60 * 1000;2829if (falg || (!timespanvalidate))30throw new SecurityException("timeSpanValidate");3132var data = string.Empty;33 IDictionary<string, string> sortedParams = null;3435switch (method.ToUpper())36 {37case"POST":38case"PUT":39case"DELETE":4041 Stream stream = HttpContext.Current.Request.InputStream;42 StreamReader streamReader = new StreamReader(stream);43 sortedParams = new SortedDictionary<string, string>(new JsonSerializer().Deserialize<Dictionary<string, string>>(new JsonTextReader(streamReader))); 4445break;4647case"GET":4849 IDictionary<string, string> parameters = new Dictionary<string, string>();5051foreach (string key in HttpContext.Current.Request.QueryString)52 {53if (!string.IsNullOrEmpty(key))54 {55 parameters.Add(key, HttpContext.Current.Request.QueryString[key]);56 }57 }5859 sortedParams = new SortedDictionary<string, string>(parameters);6061break;6263default:64throw new SecurityException("defaultOptions");65 }6667 StringBuilder query = new StringBuilder();6869if (sortedParams != null)70 {71foreach (var sort in sortedParams.OrderBy(k => k.Key))72 {73if (!string.IsNullOrEmpty(sort.Key))74 {75 query.Append(sort.Key).Append(sort.Value);76 }77 }7879 data = query.ToString().Replace("", "");80 }8182var md5Staff = Seedwork.Utils.CharHelper.MD5(string.Concat(timestamp + nonce + staffId + data), 32);8384if (!md5Staff.Equals(signature))85throw new SecurityException("md5Staff");8687base.OnActionExecuting(actionContext);88 }8990public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 91 {92base.OnActionExecuted(actionExecutedContext);93 }94 }7、最后在 mvc ⾥加⼊配置上述类public static class WebApiConfig{public static void Register(HttpConfiguration config){// Web API configuration and servicesconfig.Filters.Add(new ApiSecurityFilter());config.Filters.Add(new ApiHandleErrorAttribute());// Web API routesconfig.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });}}public class ApiHandleErrorAttribute: ExceptionFilterAttribute{///<summary>/// add by laiyunba///</summary>///<param name="filterContext">context oop</param>public override void OnException(HttpActionExecutedContext filterContext){LoggerFactory.CreateLog().LogError(Messages.error_unmanagederror, filterContext.Exception); }}9、利⽤微信⼩程序测试接⼝var data = {UserName: username,Password: password,Action: 'Mobile',Sms: ''};var timestamp = util.gettimestamp();var nonce = util.getnonce();if (username && password) {wx.request({url: rootUrl + '/api/login',method: "POST",data: data,header: {'content-type': 'application/json','timestamp': timestamp,'nonce': nonce,'signature': util.getMD5Staff(data, timestamp, nonce)},success: function (res) {if (res.data) {1)其中getMD5Staff函数:function getMD5Staff(queryData, timestamp, nonce) {var staffId = getstaffId();//保存的key与webapi同步var data = dictionaryOrderWithData(queryData);return md5.md5(timestamp + nonce + staffId + data);}2)dictionaryOrderWithData函数:function dictionaryOrderWithData(dic) {//eg {x:2,y:3,z:1}var result = "";var sdic = Object.keys(dic).sort(function (a, b) { return a.localeCompare(b) });var value = "";for (var ki in sdic) {if (dic[sdic[ki]] == null) {value = ""}else {value = dic[sdic[ki]];}result += sdic[ki] + value;}return result.replace(/\s/g, "");}10、测试⽇志LaiyunbaApp Error: 2 : 2017-10-18 09:15:25 Unmanaged error in aplication, the exception information is Exception:System.Security.SecurityException: 安全性错误。
详解ASP.NETCoreWebApi返回统一格式参数
详解CoreWebApi返回统⼀格式参数这篇⽂章主要介绍了详解 Core WebApi 返回统⼀格式参数,⼩编觉得挺不错的,现在分享给⼤家,也给⼤家做个参考。
⼀起跟随⼩编过来看看吧业务场景:业务需求要求,需要对 WebApi 接⼝服务统⼀返回参数,也就是把实际的结果⽤⼀定的格式包裹起来,⽐如下⾯格式:{"response":{"code":200,"msg":"Remote service error","result":""}} 具体实现:using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.Filters;public class WebApiResultMiddleware : ActionFilterAttribute{public override void OnResultExecuting(ResultExecutingContext context){//根据实际需求进⾏具体实现if (context.Result is ObjectResult){var objectResult = context.Result as ObjectResult;if (objectResult.Value == null){context.Result = new ObjectResult(new { code = 404, sub_msg = "未找到资源", msg = "" });}else{context.Result = new ObjectResult(new { code = 200, msg = "", result = objectResult.Value });}}else if (context.Result is EmptyResult){context.Result = new ObjectResult(new { code = 404, sub_msg = "未找到资源", msg = "" });}else if (context.Result is ContentResult){context.Result = new ObjectResult(new { code = 200, msg = "", result= (context.Result as ContentResult).Content });}else if (context.Result is StatusCodeResult){context.Result = new ObjectResult(new { code = (context.Result as StatusCodeResult).StatusCode, sub_msg = "", msg = "" });}}} Startup添加对应配置:public void ConfigureServices(IServiceCollection services){services.AddMvc(options =>{options.Filters.Add(typeof(WebApiResultMiddleware));options.RespectBrowserAcceptHeader = true;});} 以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持脚本之家。
ASP.NET(C#)WebApi通过文件流下载文件的实例
(C#)WebApi通过⽂件流下载⽂件的实例下载⽂件到本地是很多项⽬开发中需要实现的⼀个很简单的功能。
说简单,是从具体的代码实现上来说的,.NET的⽂件下载⽅式有很多种,本⽰例给⼤家介绍的是 Web Api⽅式返回HttpResponseMessage下载⽂件到本地。
实现的⽅法很简单,其中就是读取服务器的指定路径⽂件流,将其做为返回的HttpResponseMessage的Content。
直接贴出DownloadController控件器的代码:using System;using System.Collections.Generic;using System.IO;using System.Linq;using ;using .Http;using .Http.Headers;using System.Web.Http;namespace DownloadFileFromWebApi.Controllers{[RoutePrefix("download")]public class DownloadController : ApiController{[Route("get_demo_file")]public HttpResponseMessage GetFileFromWebApi(){try{var FilePath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/download/EditPlus64_.zip");var stream = new FileStream(FilePath, FileMode.Open);HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);response.Content = new StreamContent(stream);response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {FileName="Wep Api Demo File.zip"};return response;}catch{return new HttpResponseMessage(HttpStatusCode.NoContent);}}}}以上就是本⽂的全部内容,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
.NetCoreWebApi的简单创建以及使用方法
.NetCoreWebApi的简单创建以及使⽤⽅法前⾔按照⽬前的软件开发发展趋势中,不管是前后端分离还是提供数据服务,WebApi使⽤的越来越⼴泛,⽽且.NET Core也是我们.NET开发⼈员未来发展的趋势,所以说学会使⽤.NET Core Api是⾮常有必要的。
本⼈作为⼀个.NET菜鸟,正在慢慢的学习中,将学到的⼀步⼀步记录下来。
⼀、创建项⽬打开VS2019,新建⼀个 Core Web 应⽤程序。
输⼊项⽬名、选择路径创建。
选择.NET Core 我这⾥⽤的是.NET Core 2.2版本,选中API,把右边的选中取消。
创建的项⽬⽬录内容如下。
⼆、编辑控制器打开Controllers⽂件夹,这⾥我直接使⽤默认创建的ValuesController控制器。
(其实是因为这是个例⼦我懒的再建了( ̄. ̄))ValuesController控制器默认内容如下。
共有四个HTTP⽅法,分别为 Get、Post、Put 和 Delete。
把该控制器的内容重新写⼀下,将路由设置为api/控制器/⽅法(api/[controller]/[action])。
按照常⽤Get 和 Post两个请求,写了两个Get⽅法和⼀个Post⽅法,⼀个参数类。
using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;namespace FirstApi.Controllers{//路由设置[Route("api/[controller]/[action]")][ApiController]public class ValuesController : ControllerBase{/// <summary>/// 获取⽂本/// </summary>/// <returns></returns>[HttpGet]public ActionResult<string> Get(){return "Hello World!";}/// <summary>/// 两数相加/// </summary>/// <param name="num1">第⼀个数</param>/// <param name="num2">第⼆个数</param>/// <returns></returns>[HttpGet]public ActionResult<int> Sum(int num1,int num2){return num1 + num2;}/// <summary>/// 两数相减/// </summary>/// <param name="param">参数</param>/// <returns></returns>[HttpPost]public ActionResult<int> Subtract(Param param){int result = param.num1 - param.num2;return result;}}/// <summary>/// 参数/// </summary>public class Param{/// <summary>/// 第⼀个数/// </summary>public int num1 { get; set; }/// <summary>/// 第⼆个数/// </summary>public int num2 { get; set; }}}然后右键项⽬→属性→调试,将启动浏览器默认指向为第⼀个Get⽅法。
ASP.NETWebAPI入门介绍(一)
WebAPI⼊门介绍(⼀)随着项⽬的复杂度越来越⾼,各种第三⽅系统的数据交互也越来越频繁,不可避免的就要⽤到Web API接⼝,这⾥Web API是⼀个⽐较宽泛的概念。
本⽂提到Web API特指 Web API。
本⽂以⼀些简单的⼩例⼦,简述 Web API的相关基础知识,仅供学习分享使⽤,如有不⾜之处,还请指正。
什么是RESTful?REST全称是Representational State Transfer,中⽂意思是表述状态转移。
REST本⾝并没有创造新的技术、组件或服务,⽽隐藏在RESTful背后的理念就是使⽤Web的现有特征和能⼒,更好地使⽤现有Web标准中的⼀些准则和约束。
如果⼀个架构符合REST的约束条件和原则,我们就称它为RESTful架构。
对于RESTful,原作者是这样描述的【我这篇⽂章的写作⽬的,就是想在符合架构原理的前提下,理解和评估以⽹络为基础的应⽤软件的架构设计,得到⼀个功能强、性能好、适宜通信的架构。
】综合上⾯的解释,我们总结⼀下什么是RESTful架构:1. 每⼀个URI代表⼀种资源;2. 客户端和服务器之间,传递这种资源的某种表现层;3. 客户端通过四个HTTP动词,对服务器端资源进⾏操作,实现"表现层状态转化"。
什么是Web API? Web API基于C#构建安全的符合REST风格的API。
通过 Web API,可以快速创建在各个客户端进⾏调⽤的服务,包括Web浏览器端和移动端等。
如下所⽰:为什么要⽤Web API? Web API是⼀个框架,可以很容易构建达成了⼴泛的HTTP服务客户端,包括浏览器和移动设备。
是构建RESTful应⽤程序的理想平台的.NET框架。
在系统架构中的地位,如下所⽰:创建 Web API项⽬⽂件--新建--项⽬打开【创建新项⽬】窗⼝,然后选择【 Web应⽤程序(.NET Framework)】,点击下⼀步,如下所⽰:进⼊【配置新项⽬】窗⼝,输⼊项⽬名称,选择项⽬保存路径,然后点击【创建】,如下所⽰:进⼊【创建新的 Web应⽤程序】创建,选择【空】,然后添加【MVC,Web API】核⼼引⽤,然后点击【创建】如下所⽰:稍等⽚刻,项⽬即创建成功,⽬录结构如下所⽰:App_Start⽬录下RouteConfig.cs为MVC核⼼引⽤,主要⽤于注册MVC路由配置App_Start⽬录下WebApiConfig.cs为Web API的核⼼引⽤,主要⽤于注册Web API的路由配置。
ASP.NETWebApi项目框架搭建(六):数据库ORM之Sqlsugar
WebApi项⽬框架搭建(六):数据库ORM之Sqlsugar ⼀、前⾔SqlSugar的优点:1、⾼性能 ,不夸张的说,去掉Sql在数据库执⾏的时间,SqlSugar是EF数倍性能,另外在批量操作和⼀对多查询上也有不错的SQL优化2、⾼扩展性,⽀持⾃定义拉姆达函数解析、扩展数据类型、⽀持⾃定义实体特性,外部缓存等3、稳定性和技术⽀持,虽然不是官⽅ORM, 但在稳定性上也是有着数年⽤户积累,如果遇到问题可以在GITHUB提出来,会根据紧急度定期解决4、功能全⾯,虽然SqlSugar⼩巧可功能并不逊⾊于EF框架5、创新、持续更新,向下兼容⼆、项⽬架构项⽬,常常会⽤到分层的概念,常⽤的有三层架构(DAL,DLL,UIL),在此基础上,我⼜细分下,下⾯是我的项⽬架构:1.webapi:主项⽬层主项⽬层主要⽤来放置控制器和⼀些插件的配置,过滤器,异常处理等。
控制器除了偶尔会做⼀些参数是否为空的验证外(有⼈认为验证也不应该在控制器层做,因⼈⽽异),其他不做任何操作,只是将参数传给下⼀层业务逻辑层处理。
2.IRepository:业务逻辑接⼝层该层为业务逻辑接⼝层,⾥⾯只罗列了相应的接⼝函数,但是具体的函数功能实现则交给继承该数据接⼝的业务逻辑层来实现。
3.Repository:业务逻辑层业务逻辑层接收到控制器层传递的参数后,将这些参数做相应的处理,然后将加⼯后的参数传给下⼀层:数据接⼝层。
(按照⽐较简单的三层架构思想,其实应该直接传给数据层,但是这⾥利⽤数据接⼝层做了⼀个分隔,好处后⾯慢慢就会发现了)4..IService 数据接⼝层该层为数据接⼝层,⾥⾯只罗列了相应的接⼝函数,但是具体的函数功能实现则交给继承该数据接⼝的数据层来实现。
这样做的好处是可以将数据库操作与代码逻辑操作分离的更加清晰。
5.Service 数据层该层负责直接或者间接对数据库进⾏操作,如果你是⽤原⽣的或者类似Dapper的数据库中间件,那么在这⼀层就会看到相应的sql语句(当然,这⾥我们选择了集成SqlSugar作为数据库操作中间件)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Soap的响应例子
HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="/2001/12/soap-envelope" soap:encodingStyle="/2001/12/soapencoding"> <soap:Body xmlns:m="/stock"> <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope>
2014-12-27
第12页
三种主流Web服务架构 - REST
• 表述状态转移: REST (Representational State Transfer),采用Web 服务使用标准的 HTTP 方法 (GET/PUT/POST/DELETE) 来抽象所 有 Web 系统的服务能力,它是一种软件架构风格, 一种针对网络应用的开发方式,可以降低开发的 复杂性。REST从资源的角度来观察整个网络,分 布在各处的资源由URI确定,而客户端的应用通过 URI来获取资源的表征。 • REST具体技术实现: WebAPI
而通过 HTTP 在应用程序间通信是更好的方法,因为 HTTP 得到了所有的因特网浏 览器及服务器的支持。SOAP 就是被创造出来完成这个任务的。 SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编 程语言的应用程序可以互相进行通信。
•
•
2014-12-27
第8页
什么是SOAP?
2014-12-27 第16页
一个Web服务的例子
• • • • • • • • • • • • • • • • • using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; namespace WebServiceSoap { public class Service1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } } }
•
•
•
2014-12-27
第5页
一个XML-RPC 的例子
以下为一个 XML-RPC 请求的范例: <?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>40</i4></value> </param> </params> </methodCall> 相对于上述请求,以下为一个寻常回应的范例: <?xml version="1.0"?> <methodResponse> <params> <param> <value><string>South Dakota</string></value> </param> </params> </methodResponse>
2014-12-27 第7页
为什么需要SOAP?
• 大型企业中信息系统大多数为多平台、多系统的复杂系统。这就要求今天的企业解 决方案具有广泛的兼容能力,可以支持不同的系统平台、数据格式和多种连接方式。 对于部署各种平台上的各式各样的程序开发来说,能在程序之间进行因特网通信是 很重要的。
•
•
以前应用程序通过使用远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之 间进行通信,但是 RPC 会产生兼容性以及安全问题;防火墙和代理服务器通常会阻 止此类流量。
• 第二,Web Service是无语言限制的,你可以使 用.NET,JAVA,PHP,VB......等多种语言开发并进行相互调用。
• 第三, 使用SOAP时数据是以ASCII文本的方式传输,调用很方便, 数据容易通过防火墙而实现无缝连接。
2014-12-27
第15页
Web服务特点总结
• 优点(适用的场景) 1、跨防火墙的通信 2、跨平台,跨语言应用程序集成 3、软件和数据重用 • 缺点(不适用的场景) 1、 单机应用程序 2、 局域网的一些应用程序
2014-12-27
第3页
WebAPI 是什么?
• WebAPI 是一种Web服
务,是服务器端的技术,要想说
清它,就要先把Web服务三种 主流架构XML-RPC,SOAP,
REST交代一下!
2014-12-27 第4页
三种主流Web服务架构 - XML-RPC
• RPC是Remote Procedure Call的缩写,中文是远程过程调用,是一种在本地的机器上调用远 端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各 个分立机器的“互操作性”而发明出来的技术。 一个RPC系统,必然包括2个部分: 1.RPC Client,用来向RPC Server调用方法, 并接收方法的返回数据; 2.RPC Server,用于响应RPC Client的请求,执行方法,并回送方法执行结果。 顾名思义,XML-RPC就是应用了XML技术的RPC,它是一种使用Http协议做为传输协议的远 程过程调用(Remote Procedure Call,RPC)机制,使用Xml文本的方式传输命令和数据。后 来在新的功能不断被引入下,这个标准慢慢演变成为今日的SOAP。 在RPC中,调用双方传递的数据常用二进制,而在XML-RPC中数据将是XML格式的。那么为什 么用XML而不用二进制呢?我想一方面是为了兼容更多的语言,因为这个世界上除了C/C++等 编译语言,还有很多其他语言,另一方面是为了隔离操作系统的差异,比如说Little Endian和 Big Endian的差异等。基于种种原因,XML-RPC选择了XML这种中间语言作为其信息的格式, 然后由各个语言负责将其转变成各自native(本土)的数据类型。
<?xml version="1.0"?> <soap:Envelope xmlns:soap="/2001/12/soapenvelope" soap:encodingStyle="/2001/12/soapencoding"> <soap:Header> ... ... </soap:Header> <soap:Body> ... ... <soap:Fault> ... ... </soap:Fault> </soap:Body> </soap:Envelope>
1. 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息。 2.可选的 Header 元素,包含头部信息。 3.必需的 Body 元素,包含所有的调用和响应信息。 4.可选的 Fault 元素,提供有关在处理此消息所发生错误的信息。
2014-12-27 第9页
SOAP 消息的基本结构
• SOAP(Simple Object Access Protocol )简单对象访问协议是是一种简 单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。 • 更简单地说:SOAP 是用于访问网络服务的协议。 SOAP=RPC+HTTP+XML
• SOAP的两个主要设计目标是简单性和可扩展性。一条 SOAP 消息就是一 个普通的 XML 文档,包含下列元素:
2014-12-27 第13页
三种主流架构的关系
• 三者目的相同:都是为了实现RPC中的消息交换,为了 更方便在网络中传输,而且由于HTTP的无状态性,都 使得HTTP为这三者的常用的传输协议。
• 发展史:从之前的各个专有系统之间不能数据交换,到 专有的XML-RPC, 后来XML-RPC慢慢的被通用的 SOAP开发方式所取代,为了进一步简化,就出现了 REST,可以使用操作更简单的JSON替代较复杂的XML。 • 发展趋势:目前在三种主流的Web服务实现方案中,因 为REST模式的Web服务与复杂的SOAP和XML-RPC对 比来讲明显的更加简洁,越来越多的Web服务开始采用 REST风格设计和实现。
2014-12-27
第6页
三种主流Web服务架构 - SOAP
• SOAP:简单对象访问协议(Simple Object Access Protocol)是一种标准化的通讯规范,主要用于Web 服务(Web Service)中。 • 例如:一个 SOAP 消息可以发送到一个具有 Web Service 功能的 Web 站点,后台有数据库,消息的参 数中标明这是一个查询消息,此站点将返回一个 XML 格式的信息,其中包含了查询结果,由于数据是用一种 标准化的可分析的结构来传递的,所以可以直接被第三 方站点所利用。 • SOAP具体技术实现: WebService, WCF