2015-12-13 173 views
2

在過去的幾個小時中,我嘗試執行web api actionasp.net webforms website中託管。 我知道它的有線但是由於舊的項目設計,我必須做的this.each時間我稱之爲Controller動作我得到從ASP.NET網站Webforms調用ASP.Net Web API

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:3049/api/chart/test?id=58'.","MessageDetail":"No action was found on the controller 'Chart' that matches the request."} 

我的項目結構如下: -

project structure

我的類代碼看起來非常簡單: -

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

      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new {id = RouteParameter.Optional } 
      ); 
      config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 

     } 
    } 

我的控制器: -

[EnableCors(origins: "*", headers: "*", methods: "*")] 
public class ChartController : ApiController 
{ 
    [HttpGet] 
    public static string test(string id) 
    { 
     return id; 
    } 
} 

我想念什麼?

+2

我從來沒有見過像這樣的靜態控制器方法。它不應該是一個實例方法嗎?另外,路由映射似乎並不意味着在路由中使用動作名稱。根據WebAPI的版本,您可能需要簡單地命名方法'Get''而不是'test'。 – David

回答

0

使您的操作方法非靜態。在微軟的文檔中,他們這樣說:

控制器上的哪些方法被認爲是「操作」?在選擇動作時,框架只查看控制器上的公共實例方法。

另外,您的路由的形式爲api/{controller}/{id},但您訪問的URL格式爲/api/controller/action?id=string。注意不匹配?您可以更改您的操作方法以匹配您的路線。

[HttpGet] 
public string Get(string id) 
{ 
    return id; 
} 

然後在/api/chart/58訪問它。

使用Web API中的默認路由結構,您的路由會告訴它哪個控制器,選定的操作方法基於HTTP方法(GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH)和參數,以及那麼URL的其他部分成爲參數。

瞭解更多有關Web API Routing on MSDN的詳細信息。