自从开始使用ASP.NET Web API,各种路由的蛋疼问题一直困扰着我,相信大家也都一样。

Web API的路由配置与ASP.MVC类似,在App_Start文件夹下,有一个WebApiConfig类文件 
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
以上为一个空Web API项目的路由配置。
 
我们新建一个Controller
 
public class TestRouteController : ApiController
{
    public HttpResponseMessage GetUser(int id)
    {
        return Request.CreateResponse(HttpStatusCode.OK, new
        {
            status = "success",
            data = new { Id = id, Name = "用户" + id }
        });
    }
}
按照msdn所述
 
To find the action, Web API looks at the HTTP method, and then looks for an action whose name begins with that HTTP method name. For example, with a GET request, Web API looks for an action that starts with "Get...", such as "GetContact" or "GetAllContacts". This convention applies only to GET, POST, PUT, and DELETE methods. You can enable other HTTP methods by using attributes on your controller. We’ll see an example of that later.
 
Web API 约定了,如果方法名带有Get,则为Get请求,其他请求方式同样道理
当然,我们也可以使用HttpGet、HttpPost等特性,或者AcceptVerbs("GET","POST",...)等等,来控制我们的请求方式。
 
根据路由配置,我们可以理解,我们的访问地址应为:
api/TestRoute/123,请求方式为GET  
 
毫无疑问的,我们拿到了想要的结果:
{"status":"success","data":{"Id":123,"Name":"用户123"}}
 
按照我们之前MVC路由的理解,路由中,new { id = RouteParameter.Optional }表示id参数是可选参数,我们期望的,在没有id传入的情况下,地址可以正常访问,id为默认值0。
 
很遗憾,直接404了。
 
我们简单改动一下代码
 
public HttpResponseMessage GetUser(int id = 0)
{
    return Request.CreateResponse(HttpStatusCode.OK, new
    {
        status = "success",
        data = new { Id = id, Name = "用户" + id }
    });
}
我们将方法参数id设定了一个默认值,居然成功了 
 
我们再变一种访问方式,api/TestRoute/?id=123
在有参数的情况下,是可以正常访问的。
而访问api/TestRoute/?id=,则会出现 {"Message":"请求无效。","MessageDetail":"对于“WebApiTest.Controllers.TestRouteController”中方法“System.Net.Http.HttpResponseMessage GetUser(System.DateTime)”的不可以为 null 的类型“System.DateTime”的参数“time”,参数字典包含一个 null 项。可选参数必须为引用类型、可以为 null 的类型或声明为可选参数。"}的400错误。
将id参数设定为int?类型,我们访问http://localhost:62488/api/TestRoute/?id=则可正常访问,并且此时id为null。
 
经过以上的测试,我们是否可以得出结论:
 
在ASP.NET Web API中,并且我们熟知的C# int未赋值时默认0,bool未赋值时默认false等在此都是不适用的
如果请求的参数在方法上定义,则参数名必须拼接在访问地址上
 
我们再试一种情况,我们将需要传入的参数放到一个类中,在方法上直接传入这个参数对象
 
public class QueryParams
{
    public int Id { get; set; }
 
    public string Name { get; set; }
}
 
public HttpResponseMessage GetUser(QueryParams queryParams)
{
    return Request.CreateResponse(HttpStatusCode.OK, new
    {
        status = "success",
        data = new { Id = queryParams.Id, Name = "用户:" + queryParams.Name }
    });        
}
直接访问api/TestRoute/,我们会发现,不管我们是否传入参数,我们的参数对象都是null。 
 
这时候我们需要为我们的参数对象添加一个FromUri的特性,来告诉web api,我们这个对象的中属性都是从url链接上传过来的
 
这时候依旧不传入任何参数,却惊奇的发现,我们的对象参数不再是null,其中属性的值也与我们料想的一致(C# int未赋值时默认0,string默认null) 
 
经过这进一步的尝试,我们可以完善我们的结论
 
通过queryString方法拼接参数时
 
如果请求的参数为C#语法定义的类型,且在方法上定义,则参数名必须拼接在访问地址上
如果请求的参数为一个实体类,则需要为该参数添加[FromUri]的特性。

ASP.NET Web API queryString访问的一点总结的更多相关文章

  1. Asp.Net Web Api 接口,拥抱支持跨域访问。

    如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问. 由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题 ...

  2. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  3. 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示

    随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是 ...

  4. 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD)

    一些小的C/S项目(winform.WPF等),因需要访问操作数据库,但又不能把DB连接配置在客户端上,原因有很多,可能是DB连接无法直接访问,或客户端不想安装各种DB访问组件,或DB连接不想暴露在客 ...

  5. ASP.NET Web API接受AngualrJS的QueryString的两种方式

    ASP.NET Web API如何接受来自AngualrJS的QueryString呢?本篇体验两种方式. 第一种方式:http://localhost:49705/api/products?sear ...

  6. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  7. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  8. ASP.NET Web API 开篇示例介绍

    ASP.NET Web API 开篇示例介绍 ASP.NET Web API 对于我这个初学者来说ASP.NET Web API这个框架很陌生又熟悉着. 陌生的是ASP.NET Web API是一个全 ...

  9. 初试ASP.NET Web API/MVC API(附Demo)

    写在前面 HTTP RESTful 创建Web API 调用Web API 运行截图及Demo下载 ASP.NET Web API是​​一个框架,可以很容易构建达成了广泛的HTTP服务客户端,包括浏览 ...

随机推荐

  1. 4星|《流量池》:Luckin Coffee营销操盘手经验谈

    流量池:“急功近利”的流量布局.营销转化 作者是一线营销操盘手,全书是作者的经验总结,这样的作者在营销类图书中比较罕见,因此这本书非常有价值. 全书是写给巨头之外的企业营销人员看的,这样的企业的流量来 ...

  2. 比特币初始版本VC6.0编译

    1 源码下载 github上初始版本是bitcoin-0.1.5,可以从https://github.com/bitcoin/bitcoin下载,但是从网上可以找到更老版本bitcoin-0.1.0, ...

  3. 2-Eleventh Scrum Meeting20151211

    第二阶段任务分工整理会议 1.会议任务: (1)明晰第二阶段的开发内容,统计未完成的功能留需完善开发. (2)安排任务分工,每个人的工作安排. (3)PM职位担任. (4)博客内容负责. 2.会议记录 ...

  4. Python 四种数值类型(int,long,float,complex)区别及转换

    Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数), 数字数据类型存储数值.他们是不可改变的数据类型,这意味着改变数字数据类型的结 ...

  5. Day Six

    站立式会议 站立式会议内容总结 442 今天:实现计划界面的逻辑 遇到的问题:模态框问题 明天:解决上面问题,开始使用动态数据 331 今天:点击添加找到文件 遇到问题:找到文件在app的引入实现 明 ...

  6. Alpha版本事后诸葛亮

    目录 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结: 本小组和其他组的评分 分工和贡献分 全组讨论的照片 问题 第一组提问回答:爸爸饿了队 第二组提问回答:拖 ...

  7. servlet编码乱码问题

    继承HttpServlet 重写doGet(HttpServletRequest req,HttpServletResponse resp),doPost()方法 post提交时: protected ...

  8. 2017-08-20 block,inline和inline-block概念和区别

    display:inline.block.inline-block的区别 display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都 ...

  9. Docker(十一)-Docker commit创建镜像

    创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 修改已有的镜像 查看已有的镜像: $ sudo docker images REPOSITO ...

  10. King's Quest POJ - 1904(强连通分量)

    建图:王子u喜欢女孩v,则u到v连一条边.对于给出的初始完美匹配,王子u与女孩v匹配,则v到u连一条边.然后求SCC. 显然对于同一个SCC中王子数目和女孩数目是相等的,并且从某个王子出发能够到达所有 ...