zoukankan      html  css  js  c++  java
  • 一个非常轻量级的 Web API Demo

    一个非常轻量级的 Web API Demo,代码量很少,实现了方法拦截器,token校验,异常拦截器,缓存

    创建项目:如果选择Web API,项目中东西会比较多,这里选择Empty,把下面的Web API勾上,MVC不要勾

    项目目录结构:

     Global.asax.cs代码:这里配置方法拦截器和异常拦截器

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Http;
    using System.Web.Routing;
    
    namespace WebApiDemo
    {
        public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                GlobalConfiguration.Configuration.Filters.Add(new MyExceptionFilter());
                GlobalConfiguration.Configuration.Filters.Add(new MyActionFilter());
                GlobalConfiguration.Configure(WebApiConfig.Register);
            }
        }
    }
    View Code

    MyActionFilter拦截器代码:

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Text;
    using System.Web;
    using System.Web.Http.Controllers;
    using System.Web.Http.Filters;
    
    namespace WebApiDemo
    {
        public class MyActionFilter : ActionFilterAttribute
        {
            public override void OnActionExecuting(HttpActionContext actionContext)
            {
                object value;
                if (actionContext.ActionArguments.TryGetValue("token", out value))
                {
                    if (value.ToString() != "000")
                    {
                        var errMsg = new
                        {
                            errorMsg = "token不匹配"
                        };
    
                        string str = JsonConvert.SerializeObject(errMsg);
                        HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.UTF8, "application/json") };
                        actionContext.Response = result;
                    }
                }
    
                base.OnActionExecuting(actionContext);
            }
        }
    }
    View Code

    MyExceptionFilter拦截器代码:

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Text;
    using System.Web;
    using System.Web.Http.Filters;
    
    namespace WebApiDemo
    {
        public class MyExceptionFilter : ExceptionFilterAttribute
        {
            //重写基类的异常处理方法
            public override void OnException(HttpActionExecutedContext actionExecutedContext)
            {
                var errMsg = new
                {
                    errorMsg = "拦截到异常:" + actionExecutedContext.Exception.Message
                };
    
                string str = JsonConvert.SerializeObject(errMsg);
                HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.UTF8, "application/json") };
                actionExecutedContext.Response = result;
    
                base.OnException(actionExecutedContext);
            }
        }
    }
    View Code

    一个简单的缓存工具类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Caching;
    
    namespace WebApiDemo
    {
        public class CacheHelper
        {
            #region 获取并缓存数据
            /// <summary>
            /// 获取并缓存数据
            /// </summary>
            /// <param name="cacheKey"></param>
            /// <param name="func">在此方法中初始化数据</param>
            /// <param name="expirationSeconds">缓存过期时间</param>
            public static T GetValue<T>(string cacheKey, Func<T> func, int expirationSeconds = 0)
            {
                object cacheValue = HttpRuntime.Cache.Get(cacheKey);
                if (cacheValue != null)
                {
                    return (T)cacheValue;
                }
                else
                {
                    T value = func();
                    HttpRuntime.Cache.Insert(cacheKey, value, null, DateTime.Now.AddSeconds(expirationSeconds), Cache.NoSlidingExpiration);
                    return value;
                }
            }
            #endregion
    
        }
    }
    View Code

    控制器MyApiController.cs代码:

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Text;
    using System.Web.Http;
    using WebApiDemo.Models;
    
    namespace WebApiDemo.Controllers
    {
        [RoutePrefix("api/MyApi")]
        public class MyApiController : ApiController
        {
            [HttpGet]
            [Route("GetAction")]
            public HttpResponseMessage GetAction(string token, string param)
            {
                var obj = new
                {
                    param = param
                };
    
                return ToJson(obj);
            }
    
            [HttpPost]
            [Route("PostAction")]
            public HttpResponseMessage PostAction(string token, string param, [FromBody] MyData data)
            {
                Random rnd = new Random();
                int d = CacheHelper.GetValue<int>("MyCacheKey1", () =>
                {
                    return rnd.Next(1, 10000);
                }, 20);
    
                var obj = new
                {
                    param = param,
                    data = data,
                    cache = d.ToString()
                };
    
                return ToJson(obj);
            }
    
            [HttpGet]
            [Route("ErrorAction")]
            public HttpResponseMessage ErrorAction(string token, string param)
            {
                var obj = new
                {
                    param = param
                };
    
                int a = Convert.ToInt32("abc");
    
                return ToJson(obj);
            }
    
            private HttpResponseMessage ToJson(object obj)
            {
                string str = JsonConvert.SerializeObject(obj);
                HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.UTF8, "application/json") };
                return result;
            }
        }
    }
    View Code

    发布:

    部署在IIS,用Postman测试:

  • 相关阅读:
    2013年发生云盘圈地大战的原因(1是因为流量成本降价,2是因为硬盘降价,3是免费是未来的商业模式)
    硬盘可以支持140万小时(也就是159年)的MTBF(硬盘只是一次性的投入)
    百度不愧为流量之王(空间的问题只是满足了用户之间的“虚荣”,而功能的完善才最终决定了事件的走向)
    唐太宗用人 不以一恶忘其善(使用每个人的特点去做事情)
    js模块化编程
    Flux
    安装配置gerrit
    redis
    Ruby
    演进式设计
  • 原文地址:https://www.cnblogs.com/s0611163/p/12494720.html
Copyright © 2011-2022 走看看