1. C#净化版WebApi框架的实现

     更新时间:2019年03月26日 15:07:12   作者:kiba518   我要评论

    这篇文章主要介绍了C#净化版WebApi框架的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    前言

    我们都知道WebApi是依赖于Asp.Net MVC的 ,所以,想创建WebApi,就需要先创建一个Asp.Net MVC项目。

    但用Visual Studio创建的MVC项目通常会带很多功能,而这些功能,很多是我们并不想用的,或者我们想用其他开源控件代替它。

    而这样杂乱的起始项目,对于我们这种有精神洁癖的开发者而言,简直是折磨。

    所以,让我们编写一个简洁版本的WebApi来净化世界吧。

    净化版WebApi预览

    首先,我们先看下净化版WebApi的结构。

    如上图所示,代码结构很简单,除开配置文件,整个Web项目只有2个文件;而需要被调用的WebApi都被封装到了WebApi程序集中了。

    接下来我们一起看下编写这个净化版WebApi的过程吧。

    净化版WebApi编写

    WebApiConfig

    首先,引入必要的Dll,如下图所示。

    然后,我们编写Web项目的写WebApiConfig;代码如下:

    public static class WebApiConfig
    
    {
      public static void Register(HttpConfiguration config)
    
      { 
    
        config.Filters.Add(new WebApiAttribute());
    
        // 解决json序列化时的循环引用问题
    
        config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
    
        // 对 JSON 数据使用混合大小?#30784;?#36319;属性名同样的大小.输出
    
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver(); 
    
        // Web API 路由
    
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
    
          name: "DefaultApi",
    
          routeTemplate: "webapi/{controller}/{id}",
    
          defaults: new { id = RouteParameter.Optional }
        ); 
      }
    }

    可以看到WebApiConfig是个静态类中,我们在其中创建了静态注册方法Register,在方法内,我们主要在做一件事,那就是为HttpConfiguration对象做配置。

    而在配置中,我们将WepApi的路由配置成了webapi/{controller}/{id},也就是说,我们的WebApi未来的访?#23454;刂方?#20026;【http://localhost:5180/webapi/Login】这样的模式。

    在WebApiConfig类中,我们还用到了这样一个类WebApiAttribute,我们在为HttpConfiguration对象的Filters属性,添加了这个类的对象。

    通过Filters属性这个字样,我们可以得出,这个类主要应用应该是过滤。

    下面我们看一下这个类的代码:

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
    public class WebApiAttribute : ActionFilterAttribute
    
    { 
    
      public override void OnActionExecuting(HttpActionContext actionContext)
    
      { 
    
        //API执行前触发
    
        if (true)//当?#21543;?#32622;,所有API都可以被调用
    
        {
    
          base.OnActionExecuting(actionContext);
    
        }
    
        else
    
        {
    
          throw new Exception("Error");
    
        } 
    
      } 
    
      public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    
      {
    
        //API执行后触发 若发生例外则不在这边处理
    
        if (actionExecutedContext.Exception != null)
    
          return; 
    
        base.OnActionExecuted(actionExecutedContext);
      }
    }

    通过阅读代码,我们应该可以发现,这是一个AOP的过滤器。

    在执行真正WebApi之前,会先进入这里进行过滤,过滤通过的API,才会调用base.OnActionExecuting(actionContext)方法进行调用和执?#23567;?/p>

    结束调用同理,结束调用前,会在该类中进行拦截和过滤处理。

    配置文件

    WebApiConfig编写结束了,现在,我们需要将这个静态类注册到项目?#23567;?/p>

    打开Global.asax文件,编写如下代码:

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
    
    public class WebApiAttribute : ActionFilterAttribute
    
    { 
    
      public override void OnActionExecuting(HttpActionContext actionContext)
    
      { 
    
        //API执行前触发
    
        if (true)//当?#21543;?#32622;,所有API都可以被调用
    
        {
    
          base.OnActionExecuting(actionContext);
    
        }
    
        else
    
        {
    
          throw new Exception("Error");
    
        } 
    
      } 
      public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    
      {
        //API执行后触发 若发生例外则不在这边处理
    
        if (actionExecutedContext.Exception != null)
    
          return; 
        base.OnActionExecuted(actionExecutedContext);
      }
    }

    可以看到,我们已通过Configure方法,将我们编写好的WebApiConfig添加到了全局配置中了。

    因为网站访问都存在跨域问题,所以我们再向Global.asax中添加如下代码处理:

    protected void Application_BeginRequest(object sender, System.EventArgs e)
    {
      var req = System.Web.HttpContext.Current.Request;
      if (req.HttpMethod == "OPTIONS")//过滤options请求,用于js跨域
    
      {
        Response.StatusCode = 200;
        Response.SubStatusCode = 200;
        Response.End();
      }
    }

    到此Web项目的编写就完成了,下面我们在WebApi程序集中,编写个简单的WebApi,代码如下:

    public class LoginController : BaseApiController
    
    { 
      public BaseResult Get()
    
      { 
        try
    
        { 
          return new BaseResult() { IsSuccess=true }; 
    
        }
        catch (Exception ex)
        {
          throw ex;
        } 
    
      }<br>}
    public class BaseApiController : ApiController
    {  
      public string Options()
      {
        return null;
      }
    }

    然后我们运行网站,进行WebApi访问。

    如上图所示,我们的WebApi访问成功。

    到此C#净化版WebApi框架就介绍完了。

    框架代码已经传到Github上了,欢迎大家下载。

    Github地址:https://github.com/kiba518/WebApi

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    相关文章

    • C#动态编译并执行字符串样例

      C#动态编译并执行字符串样例

      这篇文章主要为大家详细介绍了C#动态编译并执行字符串样例,具有一定的参考价值,?#34892;?#36259;的小伙伴们可以参?#23478;?#19979;
      2017-07-07
    • C#计算程序执行过程花费时间的方法

      C#计算程序执行过程花费时间的方法

      这篇文章主要介绍了C#计算程序执行过程花费时间的方法,涉及C#简单的时间运算技巧,具有一定参考借鉴价值,需要的朋友可以参考下
      2015-09-09
    • C#版的 Escape() 和 Unescape() 函数分享

      C#版的 Escape() 和 Unescape() 函数分享

      从网上看到两个方法, C# 版的 Escape() 和 Unescape(),收藏下。
      2011-05-05
    • RegexOptions.IgnoreCase正则表达?#25945;?#25442;,忽略大小写

      RegexOptions.IgnoreCase正则表达?#25945;?#25442;,忽略大小写

      RegexOptions.IgnoreCase正则表达?#25945;?#25442;,忽略大小写,需要的朋友可以参?#23478;?#19979;
      2013-03-03
    • C# LINQ to XML应用介绍

      C# LINQ to XML应用介绍

      .Net又引入了LINQ,于是LINQ to XML也就应运而生,所以在.Net中,不仅可以用W3C XML DOM标准,还可以使用LINQ to XML来操作XML文档。下面就来简单介绍一下如?#38382;?#29992;LINQ to XML
      2012-11-11
    • C#生成唯一不重复订单号

      C#生成唯一不重复订单号

      本文给大家介绍的是使用C#生成唯一不重复订单号的方法,主要用到了lock锁,有需要的小伙伴可以参考下。
      2015-07-07
    • Datagridview使用技巧(9)Datagridview的右键菜单

      Datagridview使用技巧(9)Datagridview的右键菜单

      这篇文章主要为大家详细介绍了Datagridview使用技巧,Datagridview的右键菜单,具有一定的参考价值,?#34892;?#36259;的小伙伴们可以参?#23478;?#19979;
      2017-05-05
    • c#防止多次运行代码收集分享

      c#防止多次运行代码收集分享

      原文:经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出?#35328;誦小?#25152;以只限于用在单用户环?#24120;?#36824;是不太完美
      2013-09-09
    • C#多线程之Thread类详解

      C#多线程之Thread类详解

      这篇文章主要为大家详细介绍了C#多线程之Thread类,具有一定的参考价值,?#34892;?#36259;的小伙伴们可以参?#23478;?#19979;
      2017-08-08
    • c#各种Timer类的区别与用法介绍

      c#各种Timer类的区别与用法介绍

      System.Threading.Timer 是一个简单的轻?#32771;?#26102;器,它使用回调方法并由线程池线程提供服务。在必须更新用户界面的情况下,建议不要使用该计时器,因为它的回调不在用户界面线程上发生
      2013-10-10

    最新评论

    山东群英会开奖查询