2016-09-28 27 views
2

HomeController.cs的WebAPI無動作被傳遞參數的控制器上找到

class HomeController : ApiController 
    { 
     [HttpGet] 
     public IHttpActionResult GetData(string name) 
     { 
      if (string.IsNullOrWhiteSpace(name)) 
      { 
       throw new ArgumentNullException("username can not be empty"); 
      } 
      return Ok("Test Done"); 
     } 
    } 

StartUp.cs

public void Configuration(IAppBuilder appBuilder) 
     {   
      HttpConfiguration config = new HttpConfiguration(); 
      config.MapHttpAttributeRoutes(); 


      config.Routes.MapHttpRoute(
       name: "GetData", 
       routeTemplate: "V2/{controller}/{name}", 
       defaults: new { controller = "Home", action = "GetData" } 
      ); 

      appBuilder.UseWebApi(config); 
     } 

四處錯誤:

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:4057/V2/Home/GetData/'.", 
    "MessageDetail": "No type was found that matches the controller named 'Home'." 

回答

2

這裏的問題很簡單。 類的訪問修飾符是非常嚴格的

class HomeController : ApiController 
    { 

默認訪問修飾符是內部的,這意味着它不能公開訪問。

嘗試訪問修飾符更改爲public公開暴露服務。

public class HomeController : ApiController 
     { 

我可以使用郵遞員和我現有的Web API複製您的問題。從我的郵遞員

My API Controller

錯誤: enter image description here

0

由於Sherlock mentioned,該API控制器必須是公開的。然而,可以考慮使用屬性,因爲它更容易出錯約定路由的路由過來:

HomeController.cs:

[RoutePrefix("V2/Home")] 
public class HomeController : ApiController 
{ 
    [HttpGet] 
    [Route("{name}", Name = "GetData")] 
    public IHttpActionResult GetData(string name) 
    { 
     if (string.IsNullOrWhiteSpace(name)) 
     { 
      throw new ArgumentNullException("username can not be empty"); 
     } 
     return Ok("Test Done"); 
    } 
} 

Startup.cs:

public void Configuration(IAppBuilder appBuilder) 
{ 
    HttpConfiguration config = new HttpConfiguration(); 
    config.MapHttpAttributeRoutes(); 
    appBuilder.UseWebApi(config); 
} 
+0

作爲附加也,路由註釋僅在MVC的具體版本,我認爲這是在MVC 5 – Sherlock

+0

由於IHttpActionResult'的'在禮物介紹它在推出的WebAPI 2 – yaakov

+0

@codran是他正在使用他的代碼 - 對吧? –

相關問題