WebApi学习笔记

1、与mvc区别:
    (1)controller继承自ApiController    
    (2)action不返回视图而是返回数据
    (3)访问:http://localhost:1671/api/products/(productscontroller)

2、浏览器访问结果区别
    (1)火狐、谷歌返回xml
     (2)IE返回json包
     原因:出现这种差别的原因是IE和Firefox发送了不同的Accept报头,因此,Web API在响应中发送了不同的内容类型
    
3、解决循环引用
    (1)App_Start文件夹,并打开名为WebApiConfig.cs的文件
        // 新代码:把JSON格式化器设置为防止对象引用,并把XML格式化器从管线(指HTTP的请求处理管线)中完全删除
        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);
        
4、Authorization
    (1)MVC和Web API都定义了Authorize注解属性,但位于不同的命名空间。MVC使用的是System.Web.Mvc.AuthorizeAttribute,而Web API使用System.Web.Http.AuthorizeAttribute
    
5、Knockout.js
    (1)是一个JavaScript库,它让HTML控件很容易与数据进行绑定。Knockout.js使用的是“模型-视图-视图模型(MVVM)”模式
    
6、ApiExplorer类
    (1)为Web API创建帮助页面
    (2)vs2013需要引用System.Net.Http 4.0.0.0 并在Areas/view/web.config中修改: <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    
7、通过.NET客户端调用Web API
    (1)安装Web API客户端库:通过NuGet :Install the Web API Client Libraries
    (2)创建一个新的HttpClient实例
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost:9000/");
        
        // 为JSON格式添加一个Accept报头
        client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json"));
    (3)具体CURD操作:http://www.cnblogs.com/r01cn/archive/2012/11/20/2779011.html
    (4)// 列出所有产品
        HttpResponseMessage response = client.GetAsync("api/products").Result;  // Blocking call(阻塞调用)!
        //采用Result属性的过程是应用程序线程阻塞的。控制台应用程序的阻塞没问题,但是,你决不应该在一个Windows应用程序的UI上做这种事,因为这会阻塞UI去响应用户的输入

8、HttpClient消息处理器
    (1)在客户端,HttpClient类使用消息处理器处理请求。默认的处理器是HttpClientHandler,它在网络上发送请求,并从服务器获取响应。你可以把自定义消息处理器插入到这种客户端管线之中.
    (2)要编写自定义消息处理器,需从System.Net.Http.DelegatingHandler进行派生,并重写SendAsync方法
        class MessageHandler1 : DelegatingHandler
        {
            private int _count = 0;
            protected override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
            {
                _count++;
                request.Headers.Add("X-Custom-Header", _count.ToString());
                return base.SendAsync(request, cancellationToken);
            }
        }
    (3)要将自定义处理器添加到HttpClient,需使用HttpClientFactory.Create方法:HttpClient client = HttpClientFactory.Create(new Handler1(), new Handler2(), new Handler3());
    (4)要在服务器端添加消息处理器,需要将该处理器添加到HttpConfiguration.MessageHandlers集合。如果创建项目用的是“ASP.NET MVC 4 Web应用程序”模板,你可以在WebApiConfig类中做这件事:
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                config.Routes.MapHttpRoute(
                    name: "Route2",
                    routeTemplate: "api2/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional },
                    constraints: null,
                    handler: new MessageHandler2()  // per-route message handler(单路由消息处理器)
                );

config.MessageHandlers.Add(new MessageHandler1());  // global message handler(全局消息处理器)
            }
        }
    (5)具体参见:http://www.cnblogs.com/r01cn/archive/2012/11/22/2781707.html
    
9、WebApi路由
    (1)Web API的默认路由模板是“api/{controller}/{id}”。在这个模板中,“api”是一个文字式路径片段,而{controller}和{id}则是占位符变量.
    (2)/api/contacts
        /api/contacts/1
        /api/products/gizmo1
    (3)路由变异
        替代用于HTTP方法的命名约定,可以明确地为一个动作指定HTTP方法,这是通过以HttpGet、HttpPut、HttpPost或HttpDelete注解属性对动作方法进行修饰来实现的.
    (4)具体参见:http://www.cnblogs.com/r01cn/archive/2012/11/23/2784224.html
    
10、ASP.NET Web API中的异常处理
    (1)异常过滤器实现System.Web.Http.Filters.IExceptionFilter接口。编写异常过滤器最简单的方式是通过System.Web.Http.Filters.ExceptionFilterAttribute类进行派生,并重写其OnException方法.
    (2)以下是将NotImplementedException(没有实现接口或抽象类要求的方法时,出现的异常)异常转换成HTTP状态码“501 — 未实现”的一个过滤器:
        public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute  
        {
            public override void OnException(HttpActionExecutedContext context)
            {
                if (context.Exception is NotImplementedException)
                {
                    context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
                }
            }
        }
    (3) 使用方式:
        [NotImplExceptionFilter]
        public Contact GetContact(int id)
        
        [NotImplExceptionFilter]
        public class ProductsController : ApiController
        
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                config.Filters.Add(new ProductStore.NotImplExceptionFilterAttribute());
        
                // Other configuration code(其它配置代码)...
            }
        }
    (4)具体参见:http://www.cnblogs.com/r01cn/archive/2012/12/04/2801664.html
    
    
11、ASP.NET Web API批处理器(不太了解)

12、ASP.NET Web API中的HTTP Cookie
    (1)具体参见:http://www.cnblogs.com/r01cn/archive/2013/05/16/3081108.html
    
13、媒体格式化器(JSON和XML)
    (1)可以自定义返回的数据格式
    (2)具体参见:http://www.cnblogs.com/r01cn/archive/2013/05/17/3083400.html

14、ASP.NET Web API中的JSON和XML序列化
    (1)参见:http://www.cnblogs.com/r01cn/p/3155653.html
    
15、模型验证
    (1)参见:http://www.cnblogs.com/r01cn/p/3193095.html

时间: 2024-10-21 19:31:25

WebApi学习笔记的相关文章

Asp.Net Core WebApi学习笔记(四)-- Middleware

Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Middleware功能支持. 在演示Middleware功能之前,先要了解一下Asp.Net管道模型发生了什么样的变化. 第一部分:管道模型 1. Asp.Net管道 在之前的Asp.Net里,主要的管道模型流程如下图所示: 请求进入Asp.Net工作进程后,由进程创建HttpWorkRequest对象

WebApi学习笔记01:webapi框架--控制器--路由

1.解决方案 1.1概述 一个解决方案里可以包含多个项目:也可以新建“解决方案文件夹”来逻辑(不是物理存在的文件夹)划分包含项目. 1.2创建方案 打开VS,文件->新建->项目: 2.Web项目 2.1概述 本例主要介绍安装WebApi框架,因为它几乎可以寄宿在任何项目中,先从空web模板项目,也不包含核心引用开始…… 2.1创建项目 在“解决方案资源管理器”中右键,添加->新建项目: 选择模板: 2.3安装webapi 在vs中,工具->NuGet程序包管理器->管理解决

WebAPi学习笔记之一 初识WebApi

公司这几天接了个APP项目,项目中要使用WebApi来作为服务端和客户端的数据交换层.于是我就被老板要求学习WebApi了. 对于ASP.Net相关知识为零的我来说,这无疑是一个难题.学习了这么久终于摸到了点门路.WebApi的定位很容易,它就是用来控制服务端和数据段数据转换的. WebApi包括控制器,路由,类model等几大内容: 类model:主要用来保存数据的. 控制器:主要用来根据客户端的method类型的响应, 路由:根据客户端的request URL来选择使用哪一个控制器,或者生成

WebApi学习笔记06:使用webapi模板--仓储模式--Unity依赖注入

1.Web项目 1.1概述 对数据操作封装使用存储模式是很常见的方式,而使用依赖注入来降低耦合度(方便创建对象,可以抛弃经典的工厂模式)…… 1.2创建项目 1.3添加模型 在Models下,添加Product.cs: namespace WebApi06.Models { public class Product { public int ID { get; set; } public string Name { get; set; } public decimal Price { get;

WebApi学习笔记02:使用webapi核心文件模板

1.Web项目 1.1概述 本例依然先从空web模板项目,但包含核心引用,这样模板帮我们创建好主要文件夹和路由默认配置…… 1.2创建项目 注意勾选“Web API”,和上一章的例子唯一的区别. 看一下自动生成的文件目录: 1.3添加控制器 在Controllers文件下,添加HelloWorldController.cs类,其代码: using System.Web.Http; namespace WebApi02.Controllers { public class HelloWorldCo

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(十)-- 发布(Windows)

本篇将在这个系列演示的例子上继续记录Asp.Net Core在Windows上发布的过程. Asp.Net Core在Windows上可以采用两种运行方式.一种是自托管运行,另一种是发布到IIS托管运行. 第一部分.自托管 一.依赖.Net Core环境 修改 project.json 文件内容,增加发布时需要包含文件的配置内容 1 { 2 "version": "1.0.0-*", 3 "testRunner": "xunit&quo

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(九)-- 单元测试

本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json 文件内容,增加XUnit相关的nuget包引用,并修改部分配置. 1 { 2 "version": "1.0.0-*", 3 "testRunner": "xunit", // 设置测试工具为xunit 4 5 "buildOpt

WebApi学习笔记03:使用webapi模板--API帮助--fiddler工具使用--增删改查方法

1.Web项目 1.1概述 前面两个例子,使用的空web模板,它没有引入关于UI框架(Bootstrap,追求代码洁癖的人,也许不会喜欢它),更没有安装API帮助, 这次我们直接选webapi模板项目,但不勾选身份验证…… 1.2创建项目 注:关于身份验证,后面单独例子再说. 这样创建的项目,直接是demo了,可以运行了.(就不截图了) 1.3修改控制器 打开Controllers\ValuesController.cs,修改为: using System.Collections.Generic

WebAPi学习笔记之 Api和返回类型(Action Results in Web API 2)

这篇文章主要是从英文翻译过来的,原文地址http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/action-results 本文主要介绍ASP.NET WebAPI如何转换API返回值到HTTP响应消息的. 一个WebAPI可以返回下面类型中的一个: 1.void 2.HttpResponseMessage 3.IHttpActionResult 4.别的类型 更具上面的不同返回类型,WebAPI使用不同的