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最方便的是给前端使用。

  • 相关阅读:
    皇帝的用人之道,这一点古今皆同
    sharepoint打包
    powershellbegin
    taxonomy
    powershelluninstall webapplication
    面试题
    字符串处理
    在页面中插入视频时的文件夹命名问题
    process object
    扩展名显示与隐藏
  • 原文地址:https://www.cnblogs.com/yuchenghao/p/10613976.html
Copyright © 2011-2022 走看看