自从开始使用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. 了不起的Node.js--之五 TCP连接

    TCP连接 传输控制协议(TCP)是一个面向连接的协议,它保证了两台计算机之间数据传输的可靠性和顺序. TCP是一种传输层协议,它可以让你将数据从一台计算机完整有序地传输到另一台计算机. Node.j ...

  2. Linux内核分析第三周总结

    构造一个简单的Linux系统MenuOS 操作系统的"两把宝剑":中断上下文的切换(保存现场和恢复现场).进程上下文的切换 Linux内核源代码简介 --------------- ...

  3. C++:派生类的构造函数和析构函数的调用顺序

    一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: • 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. • 改造基类函数:在 ...

  4. Linux换源

    Linux换源 前言 最近学校的ipv6坏了,导致从deepin本身获取的源速度极慢,笔者实在忍无可忍,随后在同学指导下换了清华大学ipv4的源 步骤 sudo gedit /etc/apt/sour ...

  5. Java 笔记——在 IDEA 中使用 Maven 配置和使用 MyBatis

    1.前言 MyBatis 是什么? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. ...

  6. Python 访问soap服务

    使用库:subs soap服务信息: 网址:http://mobile.bjmemc.com.cn/AirService/Service.asmx 功能:使用其中的GetData服务获取北京各个地点的 ...

  7. Citrix Merchandising Server 配置

    获取Citrix Merchandising Server虚拟镜像: 我们可以从Citrix官网上下载Citrix Merchandising Server(分为XenServer和vSphere), ...

  8. Linux命令(三) 移动文件 mv

    用户可以使用 mv 命令来移动文件或目录至另一个文件或目录, 还可以将目录或文件重命名. 如果将一个文件移动到一个已经存在的目标文件中,目标文件的内容将会被覆盖.mv 命令接收两个参数时,第一个参数表 ...

  9. python学习:python的星号(*)和双星号(**)用法

    原帖地址见:[Python]-12-星号变量的特殊用法 在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入 ...

  10. SVN Update Error: Please execute the 'Cleanup' command

    尝试用下面两种方法 svn clean up 中有一个选项break lock勾选上 把对应的文件来里的.svn里面的lock文件删除. svn local delete, incoming dele ...