【WebApi】(一)Asp.net web api中的坑-【找不到与请求 URI匹配的 HTTP 资源】

    在.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 资源”

    TIM截图20170707104956

      

尝试修改controller中的action名字,发现类post,get开头的action-public void GetData1(string data),但是诡异的问题是当继续再添加几个action-public void GetData2(string data),public void GetData2(string data);TIM截图20170707112306

此时我的心情就是“日了狗了”明明就是两个不同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

image

再请求,image

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

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

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

答案,就是改路由的配置文件,image

 

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

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

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


作者:Garfield

同步更新至个人博客:http://www.randyfield.cn/

本文版权归作者所有,未经许可禁止转载,否则保留追究法律责任的权利,若有需要请联系287572291@qq.com

posted @ 2017-07-07 11:55  Garfield-加菲  阅读(14747)  评论(7编辑  收藏  举报