自从开始使用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. 开发认为不是bug,你该如何处理?

    这是软件测试员面试时经常被问到的问题.看了很多答案,个人觉得作为有工作经验的测试人员回答时不能完全照搬标准答案,技术面试官想听的当然不止如此.毕竟这种情况在实际工作中也常常出现,具体问题要具体分析,你 ...

  2. Verilog HDL数组(存储器)操作

    本文从本人的163博客搬迁至此. 引用了http://blog.sina.com.cn/s/blog_9424755f0101rhrh.html Verilog HDL中常采用数组方式来对存储器进行建 ...

  3. 了不起的Node.js--之二

    安装模块 使用NPM包管理器可以让你轻松对模块进行管理,它会下载指定的包.解决包的依赖.进行测试脚本及安装命令行脚本. 安装二进制工具包 有的项目分发的是Node编写的命令行工具.这个时候,安装时要增 ...

  4. 每日scrum(7)

    今天是小组用来写文稿的日子,包括软件需求分析报告,概要设计报告,详细设计报告,数据库设计报告,软件测试报告,各组员领取自己的任务然后完成~ 任务看板: 燃尽图:

  5. ”数学口袋精灵“第二个Sprint计划---第二天

    “数学口袋精灵”第二个Sprint计划----第二天进度 任务分配: 冯美欣:欢迎界面的音效 吴舒婷:游戏界面的动作条,选择答案后的音效 林欢雯:完善算法代码的设计 进度:   冯美欣:找到了几个音乐 ...

  6. 在eclipse中编译调试ns3

    1首先把ns3项目导入eclipse 然后把上面的的ns3按照上面的提示即可导入成功.   然后可以运行一下 ./waf configure     2 配置C/C++ Build 右键工程,选择属性 ...

  7. vs2013的安装及测试(第三周)

    1.打开同学给的安装包,发现如下问题: 2.因为是win7,提示需安装IE10.因为安装IE10必须要在安装好 server pack 1的情况下,所以从官方网站上下载好server pack 1,并 ...

  8. Xcode常见设置

    1.设置主题和字体大小

  9. Helm 安装 nginx-ingress 的方法

    还是没学会 今天继续研究. Using Helm NGINX Ingress controller can be installed via Helm using the chart stable/n ...

  10. POWERSHELL 计划任务的创建,收集DC中失败的登录信息并邮件通知

    (注:本文参考以下前辈文章修改而来,源文章连接:http://itadmindev.blogspot.hk/2011/07/powershell-ad-dc-failed-logins-report. ...