问题场景:

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

代码如下:
ProductController 代码:

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

HttpClient 测试调用代码:

[Fact]
public void WebApiTest_AddProduct()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:1661/"); var requestJson = JsonConvert.SerializeObject(
new
{
id = "",
name = ""
}); 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 ;
} public class Product
{
public string id { get; set; }
public string name { get; set; }
}
}

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

C# 调用api的方法的更多相关文章

  1. zabbix调用api检索方法

    环境 zabbix:172.16.128.16:zabbix_web:172.16.16.16/zabbix 用户名:Admin 密码:zabbix 获取的数据仅做参考,以Linux发送HTTP的PO ...

  2. 怎么调用api接口

    api的简单调用,调用api的方法 方法一:用前端方法调用api 完整代码: <!DOCTYPE html> <html lang="en"> <he ...

  3. 微信的API都是通过https调用实现的,分为post方法调用和get方法调用。不需要上传数据的采用get方法(使用IntraWeb开发)

    首先需要明确的是,微信的API都是通过https调用实现的,分为post方法调用和get方法调用.不需要上传数据的采用get方法(例如获取AccessToken),而需要向微信服务器提交数据的采用po ...

  4. C#调用API函数EnumWindows枚举窗口的方法

    原文 http://blog.csdn.net/dengta_snowwhite/article/details/6067928 与C++不同,C#调用API函数需要引入.dll文件,步骤如下: 1. ...

  5. ASP.NET后台调用API方法

    /// <summary> /// 调用API POST请求与获取结果 /// </summary> ///URL 与 JSON串 public static string H ...

  6. WebApiClient.AOT.dll 调用api地址 -> 调用方法

    优点:简化api调用过程,WebApiClient.AOT.dll中的IHttpApi接口 缺点:只适用于内部服务之间的调用(没有验证过程) 1.继承IHttpAPi接口 public interfa ...

  7. C#MVC通过AJAX调用API方法进行上传下载

    //这是写的一个类,具体是上传图片的上传和下载 public class FileResult    {        public int Code { get; set; }        pub ...

  8. c# 调用c++DLL方法及注意事项

    引用命名空间 using System.Runtime.InteropServices 调用方法: 一.静态加载 用DllImprot方式来加载c++DLL.如下格式: //对应c++方法 //voi ...

  9. 调用webservice客户端方法 runtime modeler error: Wrapper class ××× is not found. Have you run APT to generate them?

    用wsimport生成webservice的客户端以后,调用客户端生成方法时总是出现 runtime modeler error: Wrapper class stardand.nrcms.nckin ...

随机推荐

  1. 【转】【MySql】Waiting for table metadata lock原因分析

    MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景.而且,一旦alter table TableA的操作停滞在Wa ...

  2. Python.Django视频教程(全13集)

    Python.Django视频教程(全13集)教程目录: 下载地址:http://www.fu83.cn/thread-205-1-1.html

  3. 产品列表页分类筛选、排序的算法实现(PHP)

    一.简单的单条件查询 工作都是从简单的开始,先从最简单的单表查询开始,这个一般用在首页以及一些比较独立的页面,只需要查找几个符合条件的产品展示出来即可,可以使用分页或者不使用分页.下面这个是产品控制器 ...

  4. Angular实现瀑布流的库angular-deckgrid

    一. 安装 bower install --save angular-deckgrid 添加代码到你的HTML 添加到你的angular模块中: angular.module('your.module ...

  5. WinForm 问题集锦

    [1]重用项目窗体解决方案: 1. 把FmMain.cs 和 FmMain.Designer.cs 和 FmMain .resx 三个文件复制到程序目录下: 2. 在vs里面添加现有项, 选择FmMa ...

  6. libsvm使用详细说明

    一,简介 LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,因此成为目前国内应用最多的SVM的库.详细的使用说明及博主博客见下链接: ...

  7. js简易函数性能测试器

    如果你不想用浏览器的js性能测试工具,可以用下面这个简单的函数测试一下(1毫秒一下的就测不出来了) function testFn(fn,param){ var start = new Date(). ...

  8. jquery里面的$(this)和this都什么时候用,有什么区别

    当你用的是jquery时,就用$(this),如果是JS,就用this $(this).html( $(this).html() + " BAM! " + i ); 这个里的htm ...

  9. 【JavaEE企业应用实战学习记录】struts国际化

    <%-- Created by IntelliJ IDEA. User: Administrator Date: 2016/10/6 Time: 16:26 To change this tem ...

  10. 12-rm 命令总结

    rm remove files or directories 删除目录或文件 [语法]: rm [选项] [参数] [功能介绍] rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其 ...