2017-07-27 64 views
1

簡單ApiController方法:Asp.Net的Web API 2模式不會自動綁定

public class TestController : ApiController 
{ 
    public void TakeIt(MyObject o){ 
     Console.Write(o.ToString()); 
    } 
} 

簡單數據類型:

public class MyObject{ 
    public string V1{ get; set; } 
    public string V2{ get; set; } 
} 

簡單的POST:

POST http://localhost:11026/api/test/takeit HTTP/1.1 
Accept: application/json 
Content-Type: application/json 
Host: localhost:11026 

{"V1":"Something","V2": "Something else"} 

出於某種原因,爲MyObject o不會自動從JSON表單發佈主體綁定(即使在參數前插入[FromBody]在方法上。

我做錯了什麼?

SOLUTION(DUH!)

調試我傳入的請求,我在Global.asax中已經把這個(因爲我沒能拿到請求通過提琴手流),這樣我就可以先檢查它們

protected void Application_BeginRequest() 
    { 
     using (Stream receiveStream = Request.InputStream) 
     { 
      using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8)) 
      { 
       var content = readStream.ReadToEnd(); 
       Console.WriteLine(content); 
      } 
     } 
    } 

這是從讀取數據發佈任何停止的路線。不久,我刪除了,自動模型綁定工作正常。

回答

1

我想你要麼用[HttpPost]來裝飾你的方法,要麼把它重命名爲PostTakeIt。我相信Web API默認爲GET。

1

兩件事情

public class TestController : ApiController 
{ 
    [HttpPost] 
    public void TakeIt([FromBody]MyObject o){ 
     Console.Write(o.ToString()); 
    } 
} 

標籤與HttpPost的行動是不是真正符合以公約爲基礎的路由,而下一個標籤與[FromBody]的參數,以便模型綁定知道去哪裏找模型。

此外,給定URI api/test/takeit這裏的假設是路由模板是api/{controller}/{action}

默認模板通常是api/{controller}/

// Convention-based routing. 
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

不迎合動作名稱。

你要麼必須增加另一個路線

// Convention-based routing.  
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

config.Routes.MapHttpRoute(
    name: "DefaultActionApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

或使用屬性路由

// Attribute routing. 
config.MapHttpAttributeRoutes(); 

// Convention-based routing. 
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

有了更新控制器

[RoutePrefix("api/test")] 
public class TestController : ApiController 
{ 
    [HttpPost] 
    [Route("takeit")] //Matches POST api/test/takeit 
    public IHttpActionResult TakeIt([FromBody]MyObject o){ 
     Console.Write(o.ToString()); 
     return Ok(); 
    } 
} 
+0

我應該明確表示,我改變了API路線映射到「api/{controller}/{action}/{id}」。不幸的是,既不向該方法添加[FromBody],也不向該方法添加[HttpPost],這對我的控制器上的綁定沒有任何影響。我有一種感覺,它的配置設置丟失的地方。 – Jimbo

+0

@Jimbo我必須同意。 OP中沒有足夠的信息用於說明。提供可用於重現問題並幫助找到解決方案的[mcve]。 – Nkosi

+0

該死的,知道這件事很簡單......我已經在我的OP中提供了更多的信息,解釋了爲什麼這不起作用。感謝您的努力。 – Jimbo

相關問題