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.WebAPI13 {14     /// <summary>15     /// WebApi全局设置16     /// </summary>17     public class WebApiApplication : System.Web.HttpApplication18     {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("\r\n" + DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss"));91             //str.Append("\r\n.客户信息:");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("\r\n\tIp:" + ip);
104             //str.Append("\r\n\t浏览器:" + Request.Browser.Browser.ToString());
105             //str.Append("\r\n\t浏览器版本:" + Request.Browser.MajorVersion.ToString());
106             //str.Append("\r\n\t操作系统:" + Request.Browser.Platform.ToString());
107             //str.Append("\r\n.错误信息:");
108             //str.Append("\r\n\t页面:" + Request.Url.ToString());
109             //str.Append("\r\n\t错误信息:" + ex.Message);
110             //str.Append("\r\n\t错误源:" + ex.Source);
111             //str.Append("\r\n\t异常方法:" + ex.TargetSite);
112             //str.Append("\r\n\t堆栈信息:" + ex.StackTrace);
113             //str.Append("\r\n--------------------------------------------------------------------------------------------------");
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最方便的是给前端使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字节一面 —— List 和 Map、Set 的区别

马上就要到金三银四佳季了&#xff0c;是找工作的好时候&#xff0c;小伙伴们一定要把握好时机&#xff0c;找到心仪的高薪工作。找工作就少不了面试&#xff0c;那我们从现在开始&#xff0c;多刷刷面试题&#xff0c;查缺补漏&#xff01;&#xff01;&#xff01; 目录 ⭐常…

C#进阶之WebAPI(三)

今天复习一下WebAPI的路由知识&#xff1a; 首先分析一下MVC路由和WebAPI路由的区别&#xff1a; 在mvc里&#xff0c;默认的路由机制是通过URL路径去匹配控制器和Action方法的&#xff0c;在mvc中的默认路由定义在App_Start文件夹下的RouteConfig.cs文件下&#xff1a; publ…

阿里一面 —— HTTP中重定向和请求转发的区别?

马上就要到金三银四佳季了&#xff0c;是找工作的好时候&#xff0c;小伙伴们一定要把握好时机&#xff0c;找到心仪的高薪工作。找工作就少不了面试&#xff0c;那我们从现在开始&#xff0c;多刷刷面试题&#xff0c;查缺补漏&#xff01;&#xff01;&#xff01; 目录 ⭐T…

C#异步编程-------异步编程模型(APM)

术语解释&#xff1a; APM 异步编程模型&#xff0c; Asynchronous Programming Model EAP 基于事件的异步编程模式&#xff0c; Event-based Asynchronous Pattern TAP 基于任务的异步编程模式&#xff0c; Task-based Asynch…

【LeetCode-SQL每日一练】—— 627. 变更性别

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。大家可以叫我小梦~ 又到了练习SQL的时候啦&#xff01;一起来学习吧&#xff01; &#x1f64b;‍♂️ 小伙伴们如果在学习过程中有不明白的地方&#xff0c;欢迎评论区留言提问&#xff0c;小梦定知无…

iis运行原理 Asp.Net详解IIS内部运行原理

本章节主要讲IIS和 管道内部如何处理客户端Http请求&#xff0c;会较多的以代码的形式讲述&#xff0c;让大家对HttpApplication、HttpHandler、HttpApplicationFactory、Page这几个在处理请求过程中扮演重要角色的对象有更深入的了解。 下面我们通过单步调式跟踪System.Web.D…

【LeetCode-SQL每日一练】—— 1179. 重新格式化部门表

&#x1f388;写在前面 &#x1f64b;‍♂️大家好呀&#xff0c;我是超梦。大家可以叫我小梦~ 又到了练习SQL的时候啦&#xff01;一起来学习吧&#xff01; &#x1f64b;‍♂️ 小伙伴们如果在学习过程中有不明白的地方&#xff0c;欢迎评论区留言提问&#xff0c;小梦定知无…

阿里一面 —— 什么是多线程?

马上就要到金三银四佳季了&#xff0c;是找工作的好时候&#xff0c;小伙伴们一定要把握好时机&#xff0c;找到心仪的高薪工作。找工作就少不了面试&#xff0c;那我们从现在开始&#xff0c;多刷刷面试题&#xff0c;查缺补漏&#xff01;&#xff01;&#xff01; 目录 ⭐什…

第九节:JWT简介和以JS+WebApi为例基于JWT的安全校验

一. 简介 1. 背景 传统的基于Session的校验存在诸多问题&#xff0c;比如&#xff1a;Session过期、服务器开销过大、不能分布式部署、不适合前后端分离的项目。 传统的基于Token的校验需要存储Key-Value信息&#xff0c;存在Session或数据库中都有弊端&#xff0c;如果按照一…

赢在CSDN —— 我们一起向前

赢在CSDN&#xff0c;一起向前&#xff01; ⭐初遇CSDN ⭐我也成为了一名创作博主 ⭐如何在CSDN赚到一桶金 ⭐CSDN带给自己的成长 ⭐对CSDN的期待 ⭐个人创作的规划 ⭐初遇CSDN 不知不觉来到CSDN已经有1379天的时间啦&#xff0c;时间过得好快呀&#xff01;记得刚踏进CS…

volatile关键字的作用-适用场景

volatile在Java并发编程中常用于保持内存可见性和防止指令重排序。内存可见性&#xff08;Memory Visibility&#xff09;&#xff1a;所有线程都能看到共享内存的最新状态&#xff1b;防止指令重排&#xff1a;在基于偏序关系的Happens-Before内存模型中&#xff0c;指令重排技…

MySQL你掌握了多少?这些SQL题你能作对几道?

MySQL是工作中常用数据库&#xff0c;必须掌握&#xff0c;但小伙伴们又掌握了多少呢&#xff0c;今天一起来测试一下吧~ 力扣SQL ⭐组合两个表 ⭐第二高的薪水 ⭐超过经理收入的员工 ⭐查找重复的电子邮箱 ⭐从不订购的客户 ⭐大的国家 ⭐删除重复的电子邮箱 ⭐有趣的…

mybatis配置文件加注释报错怎么办?改一笔就能帮你解决

今天配置mybatis写了一个小demo&#xff0c;本以为顺顺利利的就完成了&#xff0c;没想到就报了如下错误。直接emo了。 java.lang.ExceptionInInitializerErrorat com.lm.learn.dao.UserTest.getUsers(UserTest.java:14)at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ…

第十二节:深究内核模式锁的使用场景(自动事件锁、手动事件锁、信号量、互斥锁、读写锁、动态锁)

一. 整体介绍 温馨提示&#xff1a;内核模式锁&#xff0c;在不到万不得已的情况下&#xff0c;不要使用它&#xff0c;因为代价太大了&#xff0c;有很多种替代方案。 内核模式锁包括&#xff1a; ①&#xff1a;事件锁 ②&#xff1a;信号量 ③&#xff1a;互斥锁 ④&#xf…

玩转Mybatis —— 一个小demo,带你快速入门Mybatis

目录 &#x1f91e;Mybatis官网介绍 &#x1f91e;Mybatis安装 &#x1f91e;Mybatis核心配置文件 &#x1f91e;构建 SqlSessionFactory &#x1f91e;获取 SqlSession &#x1f91e;通过 XML 定义已映射的 SQL 语句 &#x1f91e;作用域&#xff08;Scope&#xff09;…

MySQL掌握的怎么样?听说这几道MySQL面试题没有几个人能答得出来

MySQL可谓是程序员必备技能&#xff0c;怎么检测自己掌握了多少呢&#xff0c;一起来测试一下吧&#xff01;一共12个关卡&#xff0c;看看你能闯到第几关&#xff1f; 目录 什么是左外链接&#xff0c;什么是右外链接&#xff1f; 分页关键字是什么&#xff1f; Select 语句…

IIS/ASP.NET 管道

ASP.NET MVC 是建立在 ASP.NET 平台上基于 MVC 模式的 Web 应用框架&#xff0c;深刻理解 ASP.NET MVC 的前提是对 ASP.NET 管道式设计具有深刻的认识。由于 ASP.NET Web 应用大都寄宿于 IIS 上&#xff0c;将两者结合起来了解在 IIS 和 ASP.NET 管道中是如何流动的。 IIS5.x与…

【JAVA知识点每日一练】 —— 运算符的那些事

都说基础不牢地动山摇&#xff0c;还真是那么回事&#xff01;别小看这运算符&#xff0c;每个语法中运算符扮演者举足轻重的角色&#xff0c;稍微没用对&#xff0c;那可就犯了大错误&#xff01; 接下来跟随小梦&#xff0c;迈着轻松且愉快的步伐一起看看运算符的那些事吧~ 运…

ASP.NET Core管道深度剖析[共4篇]

在《管道是如何处理HTTP请求的&#xff1f;》中&#xff0c;我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍&#xff0c;接下来我们需要了解的是这样一个管道是如何被构建起来的。这样一个管道由一个服务器和一个HttpApplication构成&#xff0c…

SQL为什么动不动就百行以K记?

发明SQL的初衷之一显然是为了降低人们实施数据查询计算的难度。SQL中用了不少类英语的词汇和语法&#xff0c;这是希望非技术人员也能掌握。确实&#xff0c;简单的SQL可以当作英语阅读&#xff0c;即使没有程序设计经验的人也能运用。 然而&#xff0c;面对稍稍复杂的查询计算…