C# 調用api的方法


問題場景:

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 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; }
}
}

測試代碼和路由配置沒有變化,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM