关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

如何实现一个非常轻量级的 Web API Demo

发布时间:2020-03-16 00:00:00

一个非常轻量级的 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 获取并缓存数据/// /// 获取并缓存数据/// /// 键/// 在此方法中初始化数据/// 缓存过期时间public static T GetValue(string cacheKey, Funcfunc, 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测试:

 


/template/Home/Zkeys/PC/Static