zoukankan      html  css  js  c++  java
  • C#进阶之WebAPI(二)

    今天学习一下:WebAPI如何使用呢?

    首先我们打开vs新建一个WebAPI项目,可以看到一共有这些文件夹目录

    首先了解一下这些文件夹/文件的意义(按照程序启动的流程,相关的配置项就不说了),

        Global.asax:这个是程序启动的文件,内部的默认方法【Application_Start】对文件绑定、WebAPI路由、mvc控制器路由等进行注册,只会在第一个用户访问的时候运行;上网找了一下相关资料,发现可以在其中添加很多的配置方法:

              

      1 using System;
      2 using System.Collections.Generic;
      3 using System.IO;
      4 using System.Linq;
      5 using System.Text;
      6 using System.Web;
      7 using System.Web.Http;
      8 using System.Web.Mvc;
      9 using System.Web.Optimization;
     10 using System.Web.Routing;
     11  
     12 namespace AAAAAA.WebAPI
     13 {
     14     /// <summary>
     15     /// WebApi全局设置
     16     /// </summary>
     17     public class WebApiApplication : System.Web.HttpApplication
     18     {
     19         /// <summary>
     20         ///  第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量
     21         ///  如聊天室的在线总人数统计,历史访问人数统计的初始化等等均可在这里定义.
     22         /// </summary>
     23         protected void Application_Start()
     24         {
     25             
     26         }
     27  
     28         /// <summary>
     29         /// 在应用程序关闭时运行的代码,在最后一个HttpApplication销毁之后执行
     30         /// 比如IIS重启,文件更新,进程回收导致应用程序转换到另一个应用程序域
     31         /// </summary>
     32         /// <param name="sender"></param>
     33         /// <param name="e"></param>
     34         void Application_End(object sender, EventArgs e)
     35         {
     36            
     37         }
     38  
     39         /// <summary>
     40         /// 每个用户访问网站的第一个页面时触发;
     41         /// </summary>
     42         /// <param name="sender"></param>
     43         /// <param name="e"></param>
     44         void Session_Start(object sender, EventArgs e)
     45         {
     46             string IP = this.Context.Request.UserHostAddress;
     47             Session["IP"] = IP;
     48         }
     49  
     50         /// <summary>
     51         /// 使用了session.abandon(),或session超时用户退出后均可触发.
     52         /// </summary>
     53         /// <param name="sender"></param>
     54         /// <param name="e"></param>
     55         void Session_End(object sender, EventArgs e)
     56         {
     57             // Session["User"]; 向数据库中记录用户退出时间
     58         }
     59         /// <summary>
     60         /// 在每一个HttpApplication实例初始化的时候执行
     61         /// </summary>
     62         /// <param name="sender"></param>
     63         /// <param name="e"></param>
     64         void Application_Init(object sender, EventArgs e)
     65         {
     66             
     67         }
     68  
     69         /// <summary>
     70         /// 在应用程序被关闭一段时间之后,在.net垃圾回收器准备回收它占用的内存的时候被调用。
     71         ///在每一个HttpApplication实例被销毁之前执行
     72         /// </summary>
     73         /// <param name="sender"></param>
     74         /// <param name="e"></param>
     75         void Application_Disposed(object sender, EventArgs e)
     76         {
     77             
     78         }
     79  
     80         /// <summary>
     81         ///所有没有处理的错误都会导致这个方法的执行
     82         /// </summary>
     83         /// <param name="sender"></param>
     84         /// <param name="e"></param>
     85         void Application_Error(object sender, EventArgs e)
     86         {
     87             #region 记录错误日志
     88             //Exception ex = Server.GetLastError().GetBaseException();
     89             //StringBuilder str = new StringBuilder();
     90             //str.Append("
    " + DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss"));
     91             //str.Append("
    .客户信息:");
     92  
     93  
     94             //string ip = "";
     95             //if (Request.ServerVariables.Get("HTTP_X_FORWARDED_FOR") != null)
     96             //{
     97             //    ip = Request.ServerVariables.Get("HTTP_X_FORWARDED_FOR").ToString().Trim();
     98             //}
     99             //else
    100             //{
    101             //    ip = Request.ServerVariables.Get("Remote_Addr").ToString().Trim();
    102             //}
    103             //str.Append("
    	Ip:" + ip);
    104             //str.Append("
    	浏览器:" + Request.Browser.Browser.ToString());
    105             //str.Append("
    	浏览器版本:" + Request.Browser.MajorVersion.ToString());
    106             //str.Append("
    	操作系统:" + Request.Browser.Platform.ToString());
    107             //str.Append("
    .错误信息:");
    108             //str.Append("
    	页面:" + Request.Url.ToString());
    109             //str.Append("
    	错误信息:" + ex.Message);
    110             //str.Append("
    	错误源:" + ex.Source);
    111             //str.Append("
    	异常方法:" + ex.TargetSite);
    112             //str.Append("
    	堆栈信息:" + ex.StackTrace);
    113             //str.Append("
    --------------------------------------------------------------------------------------------------");
    114             ////创建路径 
    115             //string upLoadPath = Server.MapPath("~/Logs/");
    116             //if (!System.IO.Directory.Exists(upLoadPath))
    117             //{
    118             //    System.IO.Directory.CreateDirectory(upLoadPath);
    119             //}
    120             ////创建文件 写入错误 
    121             //System.IO.File.AppendAllText(upLoadPath + DateTime.Now.ToString("yyyy.MM.dd") + ".log", str.ToString(), System.Text.Encoding.UTF8);
    122             ////处理完及时清理异常 
    123             //Server.ClearError();
    124             ////跳转至出错页面 
    125             //Response.Redirect("Error.html");
    126             #endregion
    127         }
    128  
    129  
    130         /// <summary>
    131         /// //每次请求时第一个出发的事件,这个方法第一个执行
    132         /// </summary>
    133         /// <param name="sender"></param>
    134         /// <param name="e"></param>
    135         void Application_BeginRequest(object sender, EventArgs e)
    136         {
    137             var url =Request.Url.ToString();
    138  
    139         }
    140  
    141         /// <summary>
    142         ///在执行验证前发生,这是创建验证逻辑的起点
    143         /// </summary>
    144         /// <param name="sender"></param>
    145         /// <param name="e"></param>
    146         void Application_AuthenticateRequest(object sender, EventArgs e)
    147         {
    148            
    149         }
    150  
    151         /// <summary>
    152         /// 当安全模块已经验证了当前用户的授权时执行
    153         /// </summary>
    154         /// <param name="sender"></param>
    155         /// <param name="e"></param>
    156         void Application_AuthorizeRequest(object sender, EventArgs e)
    157         {
    158             
    159         }
    160  
    161         /// <summary>
    162         /// 当ASP.NET完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过处理程序(页面或者是WebService)的执行。
    163         ///这样做可以改善网站的性能,这个事件还可以用来判断正文是不是从Cache中得到的。
    164         /// </summary>
    165         /// <param name="sender"></param>
    166         /// <param name="e"></param>
    167         void Application_ResolveRequestCache(object sender, EventArgs e)
    168         {
    169             
    170         }
    171  
    172         /// <summary>
    173         /// 读取了Session所需的特定信息并且在把这些信息填充到Session之前执行
    174         /// </summary>
    175         /// <param name="sender"></param>
    176         /// <param name="e"></param>
    177         void Application_AcquireRequestState(object sender, EventArgs e)
    178         {
    179            
    180         }
    181  
    182         /// <summary>
    183         /// 在合适的处理程序执行请求前调用
    184         ///这个时候,Session就可以用了
    185         /// </summary>
    186         /// <param name="sender"></param>
    187         /// <param name="e"></param>
    188         void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    189         {
    190            
    191         }
    192  
    193  
    194         /// <summary>
    195         ///当处理程序完成对请求的处理后被调用。
    196         /// </summary>
    197         /// <param name="sender"></param>
    198         /// <param name="e"></param>
    199         void Application_PostRequestHandlerExecute(object sender, EventArgs e)
    200         {
    201             
    202         }
    203  
    204         /// <summary>
    205         /// 释放请求状态
    206         /// </summary>
    207         /// <param name="sender"></param>
    208         /// <param name="e"></param>
    209         void Application_ReleaseRequestState(object sender, EventArgs e)
    210         {
    211            
    212         }
    213  
    214         /// <summary>
    215         /// 为了后续的请求,更新响应缓存时被调用
    216         /// </summary>
    217         /// <param name="sender"></param>
    218         /// <param name="e"></param>
    219         void Application_UpdateRequestCache(object sender, EventArgs e)
    220         {
    221             
    222         }
    223  
    224         /// <summary>
    225         /// EndRequest是在响应Request时最后一个触发的事件
    226         ///但在对象被释放或者从新建立以前,适合在这个时候清理代码
    227         /// </summary>
    228         /// <param name="sender"></param>
    229         /// <param name="e"></param>
    230         void Application_EndRequest(object sender, EventArgs e)
    231         {
    232             
    233         }
    234  
    235         /// <summary>
    236         /// 向客户端发送Http标头之前被调用
    237         /// </summary>
    238         /// <param name="sender"></param>
    239         /// <param name="e"></param>
    240         void Application_PreSendRequestHeaders(object sender, EventArgs e)
    241         {
    242             
    243         }
    244  
    245         /// <summary>
    246         /// 向客户端发送Http正文之前被调用
    247         /// </summary>
    248         /// <param name="sender"></param>
    249         /// <param name="e"></param>
    250         void Application_PreSendRequestContent(object sender, EventArgs e)
    251         {
    252             
    253         }
    254     }
    255 }

        App_Start:这里面主要是程序启动的时候需要进行的一下注册文件,比如路由,文件筛选什么的;

    其他的就不介绍了。

    打开框架默认提供的控制器【ValuesController】,可以看到内部提供了5个demo,分别是无参Get,带参Get,Post,Put,Delete的请求方式,其中Post和Put的例子参数都是带有【FromBody】特性,这里介绍一下【FromBody】和【FromUrl】;

        【FromBody】:强制接口从FormData中读取数据;

        【FromUrl】:强制接口从Uri中读取数据。

    webApi的路由我们可以看到

    控制器之后是直接带参数的,程序是如何根据路由找到对应的接口的呢?WebApi是遵循RESTful设计风格的,webapi会根据请求方式的不同来自动寻找对应的接口,如果一个webAPI控制器内部对于同样的请求方式有多个接口,那么webapi默认路由会找不到对应的接口而报错,如果要遵循RESTful风格,可能需要对每个业务的接口进行控制器隔离。

    那么如果需要改变这种请求方式,变成和MVC类似的请求,应该如何修改呢?

    我们需要将webapi添加一个路由机制:

    这样我们就可以使用mvc模式的路由或者webapi默认路由进行接口的调用了。

    WebApi是遵循Restful风格的,所以不建议在路由中出现action,不推荐使用和MVC控制器相同格式的路由

    那么使用webapi有哪些地方需要注意呢?

        1.ajax中的type有四种方式:get(查询),post(修改),delete(删除),put(插入) 。

                  2.写webapi时,在后台的方法最好将特性标记号对应上[HttpGet],[HttpPost],[HttpDelete],[HttpPut]。http请求和rest风格的api如果不想在后台方法写特性,但也可以将方法名以Get开头,否则会报错。

                            get:若是查询数据,通过get,其实get请求会将参数拼装到url上面,而url长度是有限的

                            post:若是对原有数据新增和修改就用post,多用post即可。post不是将参数放在url上面的,而是放在表单上的。

                  3.传递的参数username名一定要相同,但是大小写可以不一样。

                 4.若是user={name:"张苏纳",id:123,age:'19'} 然后data:user那么在后台是接收不到的,即使在页面调试时是可以看到数据。若是想接收到的话,需要在后台写成GetUserModeuri([FormUri]Users user)。

                 5.基于第4的另一种方法。可以将user序列化转化为一个字符窜,然后后台接收后反序列化即可得到。data:{userString:JSON.stringify(user)}

                 6.(1)若是通过post请求的时候,是将数据放在from data里面的,若是传递单个参数,不要在ajax上不要写对应参数。

                    (2)只有不写id才能得到,与[formbody]无关。若是通过post传递实体,那么在后台可以直接拿到 ,不需要任何转化。

                    (3)当然也可以通过data:Json.stringify(user)      contentType:'application/json'(contentType默认是json类型的)来在后台同样得到。

                    (4)若是参数包含了一个实体,还有一个字符串参数data:{"User":user,"Info":info}该怎么办,可以通过引用Newtonsoft.Json.Linq的JObject类型。jObject.ToObject是一个序列化方法,将josn转化为对象。

                 7.dynamic动态类型,比如一个实体和一个参数放到同一个对象中,获取对象后,然后dynamic json=jData; var mm= json.user,动态类型是可以直接访问属性的。

                 8.put和post是一样的使用,put主要是插入数据使用。

                 9.delete也是一样的。

                 10.webapi最方便的是给前端使用。

  • 相关阅读:
    SQL Server Audit监控触发器状态
    SQL Server 数据变更时间戳(timestamp)在复制中的运用
    SQL Server 更改跟踪(Chang Tracking)监控表数据
    SQL Server 变更数据捕获(CDC)监控表数据
    SQL Server 事件通知(Event notifications)
    SQL Server 堆表行存储大小(Record Size)
    SQL Server DDL触发器运用
    SQL Server 默认跟踪(Default Trace)
    SQL Server 创建数据库邮件
    SQL Server 跨网段(跨机房)FTP复制
  • 原文地址:https://www.cnblogs.com/yuchenghao/p/10613976.html
Copyright © 2011-2022 走看看