2017-02-14 49 views
0

我在调用APIController中的动作时遇到了很奇怪的路由问题。我有一个WebApp,但需要一个APIController,所以我在App_start和Global.asax中加入了WebAPIConfig.cs不区分URL中的操作名称路径 - asp.net web api

但是,当我尝试在APIController内部调用不同的Actions时,除非添加参数,否则似乎不区分Actions。例如,如果我拨打api/controller/happy,它将输入与相同的Action。它输入在Controller中首先创建的Action。

对我来说这没有意义,在URL中没有考虑Action-names。

我的API控制器:

public class RegistrationManagerController : ApiController 
    { 
     EventHelper eh = new EventHelper(); 

     [HttpGet] 
     public IHttpActionResult IsUserRegistered(string skypeid) 
     { 
      var skypeuser = Exist.CheckIfRegistered(skypeid); 

      return Ok(skypeuser); 
     } 

     [HttpGet] 
     public async Task<IHttpActionResult> Happy() 
     { 
      var events = await eh.GetHappyRecent(); 

      return Ok(events); 
     } 

     [HttpGet] 
     public async Task<IHttpActionResult> Sad() 
     { 
      var events = await eh.GetSadRecent(); 

      return Ok(events); 
     } 

     [HttpPost] 
     public async Task<IHttpActionResult> UpdateEvent() //TODO id send in body? 
     { 
      await eh.Update("id"); 

      return Ok(); 
     } 
    } 

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

我RouteConfig(这是一个Web应用,而非网络API):

public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.MapMvcAttributeRoutes();// New feature 
      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
+0

看到这里,看起来像你的确切问题http://stackoverflow.com/questions/10121152/api-controller-declaring-more-than-one-get-statement –

+1

你的routetemplate不包含行动,只是控制器 – Dexion

回答

2

Routetemplate应该

routeTemplate: “API/{控制器}/{行动}/{ID}”