壮士断腕(WCF Web API),为的是 ASP.NET Web API 的横空出世,再加上它的开放(开源),于是对之产生了一点点痴情,并写下了HttpClient + ASP.NET Web API, WCF之外的另一个选择。那时,ASP.NET Web API 还处于 beta 阶段,俗话说女大十八变,自然对 ASP.NET Web API RC 产生了憧憬。。。

ASP.NET Web API RC 闪亮登场之后,还未一睹庐山真面目,就有人陆陆续续反馈之前博文中的示例代码在 ASP.NET Web API RC 版中无法正常运行。其间,我们有一个使用了 ASP.NET Web API 的项目升级至 ASP.NET Web API RC 之后也遇到了同样的问题,通过 HttpClien 将 json 格式的数据 post 给服务器之后,服务端控制器中对应的 Action 却收不到数据,错误信息为:"The parameters dictionary contains a null entry for parameter 'startId' of non-nullable type 'System.Int32' for method..."。

开始以为是 HttpClient 的问题,之前的代码是通过 Json.NET 将需要传递的数据序列化为 json 字符串的,代码如下:

var requestJson = JsonConvert.SerializeObject(new { startId = 1, itemcount = 3 });

HttpContent httpContent = new StringContent(requestJson);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var httpClient = new HttpClient();
var responseJson = httpClient.PostAsync("http://localhost:9000/api/demo/sitelist", httpContent)
.Result.Content.ReadAsStringAsync().Result;

而 ASP.NET Web API RC 的改进之一是内置对 Json.NET 的支持,所以 post json 格式的数据更简单了,上面的代码可以改为:

var responseJson = new HttpClient().PostAsJsonAsync("http://test.cnblogs.cc/api/demo/sitelist",
new { startId = 1, itemcount = 3 }).Result.Content.ReadAsStringAsync().Result;

但是 HttpClient 的代码更改之后,问题依然存在,用 Fiddler 查看了一下 post 过去的数据,原汁原味正宗的 json 数据,看来问题出在服务器端。

这时,有人反馈通过 jQuery 的 $.ajax 提交 json 数据,服务端也收不到。不用想了,问题肯定出在服务端。看看示例程序的服务端代码:

public class DemoController : ApiController
{
public IList<Site> SiteList(int startId, int itemcount)
{
...
return result;
}
}

问题应该出在 RC 版本中,ASP.NET Web API 将接收到的 post 数据传统给 Action 的处理方式发生了改变。首先可以肯定的是,ASP.NET Web API RC 不可能不支持 json 参数。难道要为此定义一个类(比如这里叫SiteListQuery),将目前的参数都作为类的属性,代码如下:

public class DemoController : ApiController
{
public IList<Site> SiteList(SiteListQuery query)
{
...
return result;
}
} public class SiteListQuery
{
public int startId { get; set; } public int itemcount { get; set; }
}

如果真是这样,就需要定义很多这样的参数类,而且即使只有一个参数,也要定义一个类。如果真是这样,我宁愿不用 ASP.NET Web API。

当时想到这里,就没有进一步去试验,心想既然不支持常用的 json 传参方式,那就暂时不用 ASP.NET Web API RC,等正式版出来再看。

今天一位同事证实了的确需要定义一个专门的参数类,才能支持 json 传参。

当同事告诉我之后,那种爱恨交加的不是滋味的感觉就迸发出来了。怎么能这样设计,即使这样设计有它的道理,也不能放弃对通常使用方式的兼容啊。良好的兼容性是微软的发家之本,怎么在这里就被无视呢?查看 ASP.NET Web API 的源代码,这部分也没有完整的测试代码。ASP.NET 也许是微软的无心插柳,但现在柳成萌了,何不借势发展为森林呢?舍不得丢下桌面,怎能开创未来?将  ASP.NET Web Stack 开源,究竟是因为它无关紧要,还是因为真正想通过社区的力量让它发展得更好?在这样的关键时期,微软是在拿自己的劣势追赶别人的优势,还是在拿自己的优势超越别人?

痴情的不是 ASP.NET Web API,而是用更优雅的技术更好的解决实际问题;

意外的不是这个有点糟糕的设计,而且没有真正从开发者的角度去考虑。

(注:一气呵成,一吐为快,也是一种写博客的方式,写的不妥之处望见谅)

ASP.NET WebAPI RC 竟然不支持最常用的json传参的更多相关文章

  1. 为Asp.net WebApi 添加跨域支持

    Nuget安装包:microsoft.aspnet.webapi.cors 原文地址:https://www.asp.net/web-api/overview/security/enabling-cr ...

  2. (摘录)ASP.NET提供文件下载函数(支持大文件、续传、速度限制、资源占用小)

    // 输出硬盘文件,提供下载 // 输入参数 _Request: Page.Request对象, _Response: Page.Response对象, _fileName: 下载文件名, _full ...

  3. ASP .NET CORE 根据环境变量支持多个 appsettings.json

    0.背景 在开发项目的过程当中,生产环境与调试环境的配置肯定是不一样的.拿个最简单的例子来说,比如连接字符串这种东西,调试环境肯定是不能连接生产数据库的.在之前的话,这种情况只能说是你 COPY 两个 ...

  4. ASP.NET Core 根据环境变量支持多个 appsettings.json配置文件 (开发和生产)

    新建一个项目,web根目录会出现一个 appsettings.json  配置文件, 此时添加--新建项,输入  appsettings.Development.json 再新增一个,appsetti ...

  5. asp.net webapi 给字段赋初始值DefaultValue 解决前端传空字符串后台接受不是“”而是NULL

    /// <summary> /// 存储ID /// </summary> public Guid SaveID { get; set; } /// <summary&g ...

  6. asp.net 通过ajax方式调用webmethod方法使用自定义类传参及获取返回参数

    实体类    public class User    {        public int Id { get; set; }        public string Name { get; se ...

  7. OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client

    一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open protocol to allow the creation and consumption of quer ...

  8. ASP.NET WebApi技术从入门到实战演练

    一.课程介绍 曾经有一位不知名的讲师说过这么一句名言: 一门RPC技术不会,那么千万万门RPC技术将都不会!在今天移动互联网的时代,作为攻城师的我们,谁不想着只写一套API就可以让我们的Web, An ...

  9. [转]OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client

    本文转自:http://www.cnblogs.com/bluedoctor/p/4384659.html 一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open ...

随机推荐

  1. 日前加拿大平板厂商 Datawind和印度运营商Reliance Communications日前宣布合作

    全球最便宜智能手机只要15美元 随着手机进入智能时代,这些年智能手机的发展可谓迅猛,苹果三星这样的手机厂商成为最大的受益者同时,低门槛也让越来越多的人开始意识到,全民智能时代确实要来了. 为了能让第三 ...

  2. CheckException和RuntimeException

    java文档中对RuntimeException的定义是: RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类. 可能在执行方法期间抛出但未被捕获的 Runt ...

  3. vue中Object.defineProperty用法

    function def (obj, key, val, enumerable) { Object.defineProperty(obj, key, { value: val, enumerable: ...

  4. plsql 中如何清除曾经登录过的用户名

    tools(工具)---> preferences(首选项) ---> login history(登录历史) ---> history(历史) ---> 把你想要删除的删除

  5. 洛谷 P2015 二叉苹果树 && caioj1107 树形动态规划(TreeDP)2:二叉苹果树

    这道题一开始是按照caioj上面的方法写的 (1)存储二叉树用结构体,记录左儿子和右儿子 (2)把边上的权值转化到点上,离根远的点上 (3)用记忆化搜索,枚举左右节点分别有多少个点,去递归 这种写法有 ...

  6. caioj 1076 动态规划入门(中链式3:最大的算式)

    一开始写了一个复杂度很大的方法,然后还过了(千万记得开longlong ) #include<cstdio> #include<cstring> #include<alg ...

  7. HN0I2000最优乘车 (最短路变形)

    HN0I2000最优乘车 (最短路变形) 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! [试题]为了简化城市公共汽车收费系 ...

  8. HDU 4349 Xiao Ming's Hope 组合数学

    题意:给你n,问在C(n,1),C(n,2)...C(n,n)中有多少个奇数. 比赛的时候打表看出规律,这里给一个数学上的说明. Lucas定理:A,B非负整数,p是质数,A,B化为p进制分别为a[n ...

  9. SqlCommand的四大方法

    SqlCommand类的方法 ---->>>1.ExecuteNonQuery(); 它的返回值类型为int型.多用于执行增加,删除,修改数据,返回受影响的行数.当select操作时 ...

  10. apache-maven-3.0.4-bin.zip

    http://zhidao.baidu.com/share/2a8974fd1546ef5f11ad9cccb3cabf88.html apache-maven-3.0.4-bin.zip