2017-08-07 34 views
1

我正在使用VS 2017社區。多年來,我一直在構建web API。但是,由於我無法得到最簡單的例子,所以一定會有變化。MVC中的web api不再工作

我在控制器文件夾一個簡單的控制器

public class TestApi : ApiController 
{ 
    // GET api/<controller> 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 
} 

我在應用程序所需的代碼開始:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

但是,當我嘗試用得到這樣的測試Web API:

http://localhost:54014/api/testapi 

我總是得到一個XML消息

Error 
Message 
No HTTP resource was found that matches the request URI 
'http://localhost:54014/api/testapi'. 
/Message 
MessageDetail 
No type was found that matches the controller named 'testapi'. 
/MessageDetail 
/Error 

這裏是WebApiConfig.cs

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

我幾個小時到撓頭這一點。正如我所說,我已經建立了許多MS Web API實現,這讓我感到困惑。

+3

嘗試將您的控制器重命名爲TestApiController。 –

+0

謝謝......嘗試過,但仍然只有名爲已更改的控制器纔會得到相同的錯誤。 –

+1

@patcapozzi show * WebApiConfig.cs *。 – Nkosi

回答

3

您應該將Controller後綴添加到您的課程名稱中。

public class TestApiController : ApiController 
{ 
    // GET api/<controller> 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 
} 

當應用程序啓動時,asp.net的MVC框架查找類建立路由表時,這個後綴(這是從ApiControllerController繼承)和註冊。當請求發送到您的應用程序時,框架再次查看路由表並將請求指向相應的控制器和操作方法。

進行此更改,重建項目並重試。

+0

啊,是'控制器命名約定'我現在記得它。也感謝Scott Hannen –

0

除了已經提供的答案(這是正確的方式),你還可以考慮使用屬性路由而不是基於約定的路由,在這種情況下,控制器的名稱無關緊要。

你已經擁有它使基於該WebApiConfig.cs

config.MapHttpAttributeRoutes(); 

所以現在它只是一個將在需要的屬性的事

[RoutePrefix("api/testapi")] 
public class TestApi : ApiController { 

    [HttpGet] 
    [Route("")] //Matches GET api/testapi 
    public IEnumerable<string> Get() { 
     return new string[] { "value1", "value2" }; 
    } 
} 

參考:Attribute Routing in ASP.NET Web API 2

+0

我完全同意。沒有基於屬性的路由,WebApi是有問題的。 –