问题场景:

ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 AddProduct 方法,参数为 Product 的各类信息(id、name等),然后操作完之后返回处理信息。

问题分析:

曾经在之前写过一篇 Web API 的博文《初试ASP.NET Web API/MVC API(附Demo)》,但只是讲解了 Get 的用法,因为比较简单,通过 URL 就可以进行传参,比如 URL:http://localhost:9283/api/product/get/1 ,这个就表示在控制器 Product 中获取 ID 为 1 的 Product,客户端不需要配置什么,直接在 HttpClient 中传入这个 URL 就可以了。

Web API 中使用 Post 的方式可以参考《HttpClient + ASP.NET Web API, WCF之外的另一个选择》,我按照文中的方式试了下,代码如下:

ProductController 代码:

    public class ProductController : ApiController
{ [HttpPost]
public int AddProduct(string id, string name)
{
return 1;
}
}

HttpClient 测试调用代码:

        [Fact]
public void WebApiTest_AddProduct()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:1661/"); var requestJson = JsonConvert.SerializeObject(
new
{
id = "1",
name = "2"
}); HttpContent httpContent = new StringContent(requestJson);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var result = client.PostAsync("api/Product/AddProduct", httpContent).Result.Content.ReadAsStringAsync().Result;
}
}

MapHttpRoute 路由配置:

        public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}

异常信息:

看起来似乎没什么问题,但为什么会抱“在控制器“Product”上找不到与该请求匹配的操作。”错误呢?从异常信息可以看出,应该是路由问题,也就是说找不到 Action-AddProduct,但是写的路由配置没什么问题啊(我自己认为),然后网上各种关键字搜索,找了很多资料,我也试了很多方式,因为对 WEB API 的路由配置不是很熟悉,然后新建 Demo,一点一点的进行测试,发现几个点,比如路由默认配置是没有 {action} 的,还有就是上面测试代码中 PostAsync,默认不知道为什么会当作 Get 使用,比如我们在 AddProduct 方法中去掉一个 name 参数,这时候我们测试会发现是执行 AddProduct,但是参数 id 变成了“AddProduct”,显然 action 的名字当作了 id 的值,这个我觉得有两个原因,一个是我路由配置没有配置好,还有就是测试客户端的代码写的有问题,因为急着解决这个问题,所以也没有研究这其中的原因,最后发现了 FromBody(只能标识一个),我之前在找问题的过程中,也是使用过它,但是当时并没有成功,现在也忘了当时的代码是怎么写的了。

记录一下 Post 可以运行的方式。

ProductController 代码:

    public class ProductController : ApiController
{ [HttpPost]
public int AddProduct([FromBody] Product product)
{
return 1;
} public class Product
{
public string id { get; set; }
public string name { get; set; }
}
}

测试代码和路由配置没有变化,测试结果:

就记录到这里。

ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)的更多相关文章

  1. ASP.NET MVC 提供与訪问 Web Api

    ASP.NET MVC 提供与訪问 Web Api 一.提供一个 Web Api 新建一个项目.类型就选 "Web Api". 我用的是MVC5,结果生成的项目一大堆东西.还编译只 ...

  2. [ASP.NET MVC 小牛之路]18 - Web API

    Web API 是ASP.NET平台新加的一个特性,它可以简单快速地创建Web服务为HTTP客户端提供API.Web API 使用的基础库是和一般的MVC框架一样的,但Web API并不是MVC框架的 ...

  3. ASP.NET MVC 和 Ruby 相结合的Web框架Oak

    在http://www.asp.net/mvc/open-source 上有个项目Oak: Frictionless development for ASP.NET MVC single page w ...

  4. asp.net MVC 上传文件 System.Web.HttpException: 超过了最大请求长度

    APS.NET MVC 上传文件出现  System.Web.HttpException: 超过了最大请求长度 这个问题 原因是 默认最大上传文件大小为4096,而我提交的文件太大了. 解决方案:修改 ...

  5. ASP.NET MVC和Web API中的Angular2 - 第1部分

    下载源码 - 903.5 KB 内容 第1部分:Visual Studio 2017中的Angular2设置,基本CRUD应用程序,第三方模态弹出控件 第2部分:使用Angular2管道进行过滤/搜索 ...

  6. 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  7. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  8. Asp.Net Web API VS Asp.Net MVC

    http://www.dotnet-tricks.com/Tutorial/webapi/Y95G050413-Difference-between-ASP.NET-MVC-and-ASP.NET-W ...

  9. ASP.NET MVC Web API 学习笔记---Web API概述及程序示例

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  10. ASP.NET MVC Web API 学习笔记---第一个Web API程序【转】

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API. ...

随机推荐

  1. K线图学习

    本博文(适合入门的股民朋友)内容来自网络,股市有风险,入市需谨慎 一.起源 K线图(Candlestick Charts)又称蜡烛图.日本线.阴阳线.棒线等,常用说法是“K线”,起源于日本十八世纪德川 ...

  2. 用SQL Server(T-SQL)获取连接字符串

    一般情况下,C# 连接SQL Server的字符串可以直接按照说明文档直接手动写出来,或者也可以参考大名鼎鼎的connectionstrings手动拼写 但是如果你已经连接到SQL Server也可以 ...

  3. 关于iOS后台问题( 一 )(ios后台刷新,后台定位,后台下载,真后台)

    关于iOS的后台,以下引用一些文段进行一下脑补,请同学们大致看一下,有个基础,原文出处 -------------------------------------------------------- ...

  4. OpenCV 3.1 Set Camera Resolution 设置相机的分辨率

    在OpenCV中,有强大的处理相机事件的api,但是貌似没有直接获取相机的最大分辨率的函数,通过属性CV_CAP_PROP_FRAME_HEIGHT和CV_CAP_PROP_FRAME_WIDTH直接 ...

  5. Fedora17安装MySQL及配置

    一.安装 以下操作均是在root用户下进行操作.首先,如果以前有安装过,这次卸载后安装的话,最好是先将/var/lib/mysql/里面的内容全部删掉(如果不重要的话),我就遇到过没有删除这些东西,结 ...

  6. ApexSQLLog可以只读取ldf文件

    ApexSQLLog可以只读取ldf文件 需要数据库在线 本文版权归作者所有,未经作者同意不得转载.

  7. 我的第一段jQuery代码

    说起 jQuery,很多人可能觉得,不算什么,就是个js类库.而,对于我,下面这几行代码,是一个新的开始. 多年来,我一直在使用MooTools ,他面向对象,写起来结构清晰分明,都是在原生js的基础 ...

  8. [翻译]理解Swift中的Optional

    原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...

  9. Lesson 5 No wrong numbers

    Text Mr.James Scott has a garage in Silbury and now he has just bought another garage in Pinhurst. P ...

  10. ASP.NET MVC 5 Web编程1 -- 入门

    开篇引言 说起ASP.NET MVC,我想作为WebForms开发者第一点要问的是:为什么要使用它?我的理解是:MVC是更细节化的框架,“细节可控”意味着你的系统更精致.具体体现在应用上.MVC的出现 ...