.net 进阶学习 WebApi (1)

  •  WebApi 的说明

 WebService--->WCF--->WebApi

RESTful架构风格:表现层的状态转化, 是一个接口的设计风格

资源:万物看成资源(主要Json),

统一接口:CRUD增删改查,跟HTTP Method对应

Create--Post Read--Get Update--Put/Patch Delete--Delete

URI:统一资源定位符,资源对应的唯一地址

无状态:基于Http协议, (登陆系统--查询工资--计算税收,有状态)

无状态的直接一个地址,就能拿到工资,就能得到税收

WebService---http协议,soap协议,只能IIS承载,入门简单,XML跨平台

WCF---集大成者,多种协议,多种宿主,整合了RPC。

RPC模式,都是调用方法的,

 

WebApi:RESTful,http协议 无状态 标准化操作 更轻量级,尤其是json,适合移动端

 

  • WebApi运行规则 
网站启动时执行Application_Start---给Routes增加地址规则---请求进来时--会经过路由匹配找到合适的《控制器》
那怎么找的Action(方法)?
1 根据HttpMethod找方法---用的方法名字开头,Get就是对应Get请求
2 如果名字不是Get开头,可以加上[HttpGet]
 [HttpGet]
 public IEnumerable<string> LGet()
{
         return new string[] { "value1", "value2" };
}
3 按照参数找最吻合
api路由配置说明:
   config.Routes.MapHttpRoute(
                name: "DefaultApi",//默认的api路由
                routeTemplate: "api/{controller}/{id}",//正则规则,以api开头,第二个是控制器  第三个是参数
                defaults: new { id = RouteParameter.Optional }
            );

 

  • 路由特性

其实资源是这样定义的,不是一个学生,而可能是一个学校
可能是一个订单--多件商品,一次查询,订单-商品,数据之前嵌套关系很复杂
还有个特性路由!可以单独订制
1 config.MapHttpAttributeRoutes();
2 标记特性

 版本兼容---约束路由---默认值/可空路由---多数据

//版本兼容
[Route("api/Values/{id}/V2")] public string GetV2(int id) { return "value V2"; }
//约束路由 默认值/可空路由
 [Route("api/Values/{id:int?}")]//可空
 public string GetId(int id = 10)//Id查询
 {
    return $"value {id}";
 }
//多数据或多参数
[Route("api/Values/{id}/Type/{typeid:int}")]
  public string GetType(int id,int typeid)
  {
        return $"value type {id}-{typeid}";
 }

 

  • IOC控制反转和依赖注入  
     控制器也要注入--完成容器和WebApi框架融合--实现IDependencyResolver,将容器放进去--初始化讲 config.DependencyResolver 换成自定义的Resolver

需要在nuget中引入Unity;

在nuget引用之后,单独引用Unity.Configuration;

如果有AOP扩展,还需要引用Unity.Interception.Configuration;

因为我们是用配置文件来做的配置;

 

配置文件内容Unity.Config:

<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
  </configSections>
  <unity>
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration"/>
    <containers>
      <container name="WebApiContainer">
        <extension type="Interception"/>
        <register type="Ruanmou.SOA.Interface.IUserService,Ruanmou.SOA.Interface" mapTo="Ruanmou.SOA.Service.UserService, Ruanmou.SOA.Service">
          <!--
          <interceptor type="InterfaceInterceptor"/>
          <interceptionBehavior type="Ruanmou.Framework.AOP.LogBeforeBehavior, Ruanmou.Framework"/>
          <interceptionBehavior type="Ruanmou.Framework.AOP.LogAfterBehavior, Ruanmou.Framework"/>
          <interceptionBehavior type="Ruanmou.Framework.AOP.ParameterCheckBehavior, Ruanmou.Framework"/>
          <lifetime type="transient" />-->
        </register>
      </container>
    </containers>
  </unity>
</configuration>

 

    Unity容器读取配置文件初始化

  public class ContainerFactory
    {
        //Unity容器
        //只需要读取一次配置文件和初始化一次
        public static IUnityContainer BuildContainer()
        {
            return _Container;
        }

        private static IUnityContainer _Container = null;
        static ContainerFactory()
        {
            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
            fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");//找配置文件的路径
            Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
            _Container = new UnityContainer();
            section.Configure(_Container, "WebApiContainer");
        }
    }

    

    完成容器和WebApi框架融合--实现IDependencyResolver ,将容器放进去
 public class UnityDependencyResolver : IDependencyResolver
    {
        private IUnityContainer _UnityContainer = null;
        public UnityDependencyResolver(IUnityContainer container)
        {
            this._UnityContainer = container;
        }
        public IDependencyScope BeginScope() //作用域
        {
            //每一个创建一个子容器,但只要读一次配置文件
            return new UnityDependencyResolver(this._UnityContainer.CreateChildContainer());
        }

        public void Dispose() //释放
        {
            this._UnityContainer.Dispose();
        }

        public object GetService(Type serviceType)
        {
            try
            {
                return this._UnityContainer.Resolve(serviceType);
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return this._UnityContainer.ResolveAll(serviceType);
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }

    

    初始化将 config.DependencyResolver 换成自定义的Resolver 

  config.DependencyResolver = new UnityDependencyResolver(ContainerFactory.BuildContainer());

    

    控制器中使用

 public class IOCController : ApiController
    {
        private IUserService _UserService = null;
        public IOCController(IUserService userService)
        {
            this._UserService = userService;
        }
        public string Get(int id)
        {
            //IUserService service = new UserService();
            //IUserService service = ContainerFactory.BuildContainer().Resolve<IUserService>();
            return Newtonsoft.Json.JsonConvert.SerializeObject(this._UserService.Query(id));
        }
    }

 

 

转载于:https://www.cnblogs.com/AlexLeeLi/p/10869476.html

目录 C#进阶系列——WebApi 路由机制剖析:你准备好了吗? ................................................................................................... 3 一、MVC和WebApi路由机制比较 ........................................................................................................................................ 5 1、MVC里面的路由 ......................................................................................................................................................... 5 2、WebApi里面的路由 ................................................................................................................................................... 5 二、WebApi路由基础 ............................................................................................................................................................. 7 1、默认路由 ..................................................................................................................................................................... 7 2、自定义路由 ............................................................................................................................................................... 10 2.1、自定义路由一:匹配到action ................................................................................................................. 11 2.2、自定义路由二 ............................................................................................................................................... 12 3、路由原理 ................................................................................................................................................................... 12 三、WebApi路由过程 ........................................................................................................................................................... 13 1、根据请求的url匹配路由模板 .............................................................................................................................. 13 2、找到控制器 ............................................................................................................................................................... 13 3、找到action ............................................................................................................................................................. 15 四、WebApi特性路由 ........................................................................................................................................................... 16 1、启动特性路由 ........................................................................................................................................................... 17 2、最简单的特性路由 ................................................................................................................................................... 17 3、带参数的特性路由 ................................................................................................................................................... 19 4、参数的约束和默认值 ............................................................................................................................................... 20 5、路由前缀 ................................................................................................................................................................... 20 五、第一个Restful风格的WebApi服务 ......................................................................................................................... 21 六、总结 ................................................................................................................................................................................. 22 C#进阶系列——WebApi 异常处理解决方案 ......................................................................................................................... 23 一、使用异常筛选器捕获所有异常 ..................................................................................................................................... 24 1、接口级别 ........................................................................................................................................................... 31 2、控制器级别 ....................................................................................................................................................... 33 3、全局配置 ........................................................................................................................................................... 34 二、HttpResponseException自定义异常信息 .............................................................................................................. 35 三、返回HttpError ............................................................................................................................................................ 37 四、总结 ................................................................................................................................................................................. 38 C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解 ......................................................................................... 39 一、void无返回值 ............................................................................................................................................................... 40 二、IHttpActionResult .................................................................................................................................................... 42 1、Json(T content) ........................................................................................................................................... 42 2、Ok()、 Ok(T content) ................................................................................................................................. 45 3、NotFound() ............................................................................................................................................................. 47 4、其他 ........................................................................................................................................................................... 49 4.1、Content(HttpStatusCode statusCode, T value) .................................................................. 49 4.2、BadRequest() ............................................................................................................................................ 49 4.3、Redirect(string location) ................................................................................................................ 50 5、自定义IHttpActionResult接口的实现 ............................................................................................................ 50 三、HttpResponseMessage ............................................................................................................................................... 53 四、自定义类型 ..................................................................................................................................................................... 54 五、总结 ................................................................................................................................................................................. 55 C#进阶系列——WebApi 接口参数不再困惑:传参详解 ..................................................................................................... 56 一、get请求 ......................................................................................................................................................................... 57 1、基础类型参数 ........................................................................................................................................................... 57 2、实体作为参数 ........................................................................................................................................................... 58 3、数组作为参数 ........................................................................................................................................................... 62 4、“怪异”的get请求 .................................................................................................................................................. 62 (1)WebApi的方法名称以get开头 ................................................................................................................ 62 (2)WebApi的方法名称不以get开头 ............................................................................................................ 64 二、post请求 ....................................................................................................................................................................... 66 1、基础类型参数 ........................................................................................................................................................... 66 (1)错误的写法 ................................................................................................................................................... 66 (2)正确的用法 ................................................................................................................................................... 67 (1)错误写法 ....................................................................................................................................................... 68 (2)正确用法 ....................................................................................................................................................... 69 (3)推荐用法 ....................................................................................................................................................... 70 2、实体作为参数 ........................................................................................................................................................... 70 (1)单个实体作为参数 ....................................................................................................................................... 70 (2)实体和基础类型一起作为参数传递 ........................................................................................................... 73 3、数组作为参数 ........................................................................................................................................................... 74 (1)基础类型数组 ............................................................................................................................................... 74 (2)实体集合 ....................................................................................................................................................... 74 4、后台发送请求参数的传递 ....................................................................................................................................... 75 三、put请求 ......................................................................................................................................................................... 77 1、基础类型参数 ........................................................................................................................................................... 77 2、实体作为参数 ........................................................................................................................................................... 77 3、数组作为参数 ........................................................................................................................................................... 78 四、delete请求 ................................................................................................................................................................... 78 五、总结 ................................................................................................................................................................................. 79 C#进阶系列——WebApi 身份认证解决方案:Basic基础认证.......................................................................................... 80 一、为什么需要身份认证 ..................................................................................................................................................... 81 1、我们不加身份认证,匿名用户可以直接通过url随意访问接口: ........................................................... 81 2、增加了身份认证之后,只有带了我们访问票据的请求才能访问我们的接口。 ....................................... 82 二、Basic基础认证的原理解析 ......................................................................................................................................... 84 1、常见的认证方式 ....................................................................................................................................................... 84 2、Basic基础认证原理 ............................................................................................................................................... 85 三、Basic基础认证的代码示例 ......................................................................................................................................... 85 1、登录过程 ................................................................................................................................................................... 85 1.1、Web前端 ....................................................................................................................................................... 85 1.2、登录的API接口 .......................................................................................................................................... 86 2、/Home/Index主界面 .............................................................................................................................................. 88 3、WebApiCORS验证部分(重点) ............................................................................................................................ 90 3.1、在WebApiCORS项目里面自定义一个类RequestAuthorizeAttribute,去继承我们的AuthorizeAttribute这个类。然后重写OnAuthorization方法,在这个方法里面取到请求头的Ticket信息,然后校验用户名密码是否合理。 ............................................................................................................. 90 3.2、在具体的Api接口增加我们上面自定义类的特性 .................................................................................. 91 四、优化 ................................................................................................................................................................................. 92 1、解决API的问题 ...................................................................................................................................................... 92 2、解决ajax的问题 .................................................................................................................................................... 93 3、解决特殊不想使用验证的方法 ............................................................................................................................... 94 五、总结 ................................................................................................................................................................................. 95 C#进阶系列——WebApi 跨域问题解决方案:CORS ............................................................................................................. 95 一、跨域问题的由来 ............................................................................................................................................................. 96 二、跨域问题解决原理 ......................................................................................................................................................... 96 三、跨域问题解决细节 ......................................................................................................................................................... 96 1、场景描述 ................................................................................................................................................................... 97 2、场景测试 ................................................................................................................................................................... 99 1)我们不做任何的处理,直接将两个项目运行起来。看效果如何 ............................................................... 99 2)使用CORS跨域 ................................................................................................................................................ 99 3)CORS的具体参数设置。 ............................................................................................................................... 103 四、总结 ............................................................................................................................................................................... 104 C#进阶系列——WebApi 接口测试工具:WebApiTestClient ........................................................................................ 105 一、WebApiTestClient介绍 ........................................................................................................................................... 106 二、WebApiTestClient展示 ........................................................................................................................................... 106 三、WebApiTestClient使用 ........................................................................................................................................... 116 1、如何引入组件 ......................................................................................................................................................... 116 2、如何使用组件 ......................................................................................................................................................... 118 1、修改Api.cshtml文件 ................................................................................................................................. 118 2、配置读取注释的xml路径 ............................................................................................................................ 119 3、测试接口 ......................................................................................................................................................... 121 四、总结 ............................................................................................................................................................................... 123
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值