俄罗斯贵宾会-俄罗斯贵宾会官网
做最好的网站

2.C#WebAPI设置路由和参数1俄罗斯贵宾会

1.当我们创建WebApi的时候我们的项目下的Contorls文件夹下的ValuesController文件下会出现这么几个方法:

在.net下,创建一个HTTP服务,有很多方案,比较老ashx,一般处理程序(HttpHandler),

       Web Service

               SOAP协议的,数据格式是XML,HTTP协议

        WCF

               基于SOAP的,数据格式是XML,可以支持各种各样的协议,像TCP,HTTP,HTTPS,Named Pipes, MSMQ.

        Web API(文章主讲)

               简单的构建HTTP服务,.net平台上Web API 是一个开源的、理想的、构建REST-ful 服务的技术,支持MVC的特征,像路由、控制器、action、filter、模型绑定、控制反转(IOC)或依赖注入(DI),单元测试。这些可以使程序更简单、更健壮,说白了,Asp.net mvc 你会用,那么编写webapi,构建http服务,也木有问题,轻量级的框架,并且对限制带宽的设备,比如智能手机等支持的很好。

        本人都自己编写测试过webservice,wcf,webapi,但是由于工作中构建的服务多用于浏览器、手机等,也是.net平台上,所以对webapi的使用更多。当然使用的路上,发现遇到的”坑“也多,当然不是说webapi不好使,主要是自己不熟悉。

 

1.    Web Api坑之“我他妈写的action,请求咋就进不来,还提示我找不到与请求 URI匹配的 HTTP 资源”

[![](https://images2015.cnblogs.com/blog/614366/201707/614366-20170707115445472-1454722283.png)](http://images2015.cnblogs.com/blog/614366/201707/614366-20170707115444378-1071314955.png)

      

尝试修改controller中的action名字,发现类post,get开头的action-public void GetData1(string data),但是诡异的问题是当继续再添加几个action-public void GetData2(string data),public void GetData2(string data);俄罗斯贵宾会 1

此时我的心情就是“日了狗了”明明就是两个不同action,你他妈居然提示我“找到了与该请求匹配的多个操作”

还是太年轻,经验太少,查阅了相关资料,

                       “      微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api

                       是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,

                       它是简单,代码可读性强的,上手快的,如果要拿它和web服务相比,我会说,它的接口

                       更标准,更清晰,没有混乱的方法名称,有的只有几种标准的请求,如get,post,put,delete

                       等,它们分别对应的几个操作,下面讲一下:

                               GET:生到数据列表(默认),或者得到一条实体数据

                               POST:添加服务端添加一条记录,记录实体为Form对象

                               PUT:添加或修改服务端的一条记录,记录实体的Form对象,记录主键以GET方式进行传输

                               DELETE:删除 服务端的一条记录

                      注意上面公开的API接口都是在XMLHttpRequest情况下调用的,当然你可以使用jquery的ajax组件

                      来完成这个请求调用,它的代码更加面向对象.”

哦,原来如此,认识webapi是认识get,post,put,delete,(这是我猜的,测试下),再加一个action,test

俄罗斯贵宾会 2

再请求,俄罗斯贵宾会 3 ,

找到了与该请求匹配的多个操作: 
类型 Service.Controllers.EnterOrExitController 的 test
类型 Service.Controllers.EnterOrExitController 的 GetData
类型 Service.Controllers.EnterOrExitController 的 UploadData

好像是猜错了,他好像才不管你action的名字,你发起httpget请求,他就把action里面的get全搞出来匹配,http-get-3个扔给你,哦,OMG,“我们找到了与该请求匹配的多个操作,你要哪一个?”,

 既然是这样,我需要在一个api控制器中写多个action用以请求访问咋办呢,怎样才能路由到指定的action,去完成http请求。

答案,就是改路由的配置文件,俄罗斯贵宾会 4

俄罗斯贵宾会 5俄罗斯贵宾会 6

 

// GET http://程序ip:程序端口/api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET http://程序ip:程序端口/api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST http://程序ip:程序端口/api/values
        public void Post([FromBody]string value)
        {
        }

        // PUT http://程序ip:程序端口/api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE http://程序ip:程序端口/api/values/5
        public void Delete(int id)
        {
        }

   可能你也发现了,这份配置文件中:

routeTemplate: "api/{controller}/{id}",

   他娘的根本没有规定action,所以怎样都匹配不到呢,人家是按照REST风格默认去找get,post,要想向asp.net mvc web中那样请求,你只能修改为routeTemplate: "api/{controller}/{action}/{id}",

另外

俄罗斯贵宾会 7

 

View Code

使用Postman工具及谷歌浏览器请求后分别获取到如下结果:(后期将统一使用Postman自己到网上下载或到这里我提供的安装包网站下载

俄罗斯贵宾会 8

是不是发现webapi请求语法并不是那么的好用,为了让其更符合我们的使用习惯,那么我们开始设计路由吧!

2.修改路由规则,使得使用更符合我们平常使用MVC的设计程序的习惯:

(1) 将routeTemplate: "api/{controller}/{id}",修改为routeTemplate: "api/{controller}/{action}/{id}",

 俄罗斯贵宾会 9俄罗斯贵宾会 10

(2) 之后你就发现我们也需要传方法名称才可以到指定的方法了,你是不是已经会自己配置路由了

俄罗斯贵宾会 11

 3.上面已经教大家如何修改全局路由了,那么修改完后我们在get请求的要这样使用,其中model模型自己创建哦

本文由俄罗斯贵宾会发布于编程,转载请注明出处:2.C#WebAPI设置路由和参数1俄罗斯贵宾会

您可能还会对下面的文章感兴趣: