zoukankan      html  css  js  c++  java
  • (一)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}",

  • 相关阅读:
    波段是金牢记六大诀窍
    zk kafka mariadb scala flink integration
    Oracle 体系结构详解
    图解 Database Buffer Cache 内部原理(二)
    SQL Server 字符集介绍及修改方法演示
    SQL Server 2012 备份与还原详解
    SQL Server 2012 查询数据库中所有表的名称和行数
    SQL Server 2012 查询数据库中表格主键信息
    SQL Server 2012 查询数据库中所有表的索引信息
    图解 Database Buffer Cache 内部原理(一)
  • 原文地址:https://www.cnblogs.com/lhxsoft/p/11887027.html
Copyright © 2011-2022 走看看