0

我已經在我的控制器上應用了屬性路由,並且它正在發出錯誤的行爲。我不知道我在哪裏弄錯了。ASP.NET Web API屬性路由到錯誤的行爲

這裏是我的控制器:

using System.Collections.Generic; 
using System.Web.Http; 
using System.Web.Http.Description; 
using System.Linq; 
using System; 

namespace Iboo.API.Controllers 
{ 
    public class ClientsController : ApiController 
    { 
     private readonly IClientRepository _repository; 

     public ClientsController(IClientRepository repository) 
     { 
      _repository = repository; 
     } 

     // GET: api/Clients 
     [Route("api/v1/clients")] 
     public IEnumerable<Client> Get() 
     { 

      //code 
     } 


     // GET: api/Clients/5 
     [HttpGet] 
     [ResponseType(typeof(Client))] 
     [Route("api/v1/clients/get/{id}")] 
     public IHttpActionResult GetClientById(int id) 
     { 
      //code 
     } 

     // GET: api/Clients/5 
     [HttpGet] 
     [ResponseType(typeof(string))] 
     [Route("api/v1/clients/{id}/emailid")] 
     public IHttpActionResult GetClientEmailId(int id) 
     { 
      //code 
     }   
    } 
} 

我在GetClientEmailId方法特別感興趣。下面是我WebApiConfig

public static void Register(HttpConfiguration config) 
{ 
    // Web API configuration and services 
    var container = new UnityContainer(); 
    container.RegisterType<IClientRepository, ClientRepository>(new 
    HierarchicalLifetimeManager()); 


    // Web API routes 
    config.MapHttpAttributeRoutes(); 

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

我的Global.asax.cs如下

public class WebApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 
} 

在瀏覽器中如果鍵入http://localhost:54919/api/v1/clients/?id=1/getemailid它帶我去http://localhost:54919/api/v1/clients這不是我想要的。

如果我嘗試http://localhost:54919/api/v1/clients/1/getemailid我收到404錯誤。

我不確定我的錯誤。

+2

當你說「它不工作」......你是什麼意思?你有錯誤嗎?如果是這樣,它說什麼?它是否會路由到意想不到的地方?如果是的話,在哪裏? – simonlchilds

+1

@Mhuhu我們可以看到調用GetClientEmailId方法的代碼嗎? – swatsonpicken

+1

尋求調試幫助的問題(「**爲什麼這段代碼不工作?**「)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現**的最短代碼**。沒有**明確問題陳述的問題**對其他讀者無效。 :如何創建一個[mcve] – Nkosi

回答

0

您根據在行動路線調用了錯誤的URL。你會得到404,因爲你所說的網址不符合任何你有你的行動

[RoutePrefix("api/v1/clients")] 
public class ClientsController : ApiController { 
    //...other code removed for brevity 

    [HttpGet] 
    [Route("")] //Matches GET api/v1/Clients 
    public IHttpActionResult Get() { 
     //code 
    } 

    [HttpGet] 
    [ResponseType(typeof(Client))] 
    [Route("{id:int}")] //Matches GET api/v1/Clients/5 
    public IHttpActionResult GetClientById(int id) { 
     //code 
    } 

    [HttpGet] 
    [ResponseType(typeof(string))] 
    [Route("{id:int}/emailid")] //Matches GET api/v1/Clients/5/emailid 
    public IHttpActionResult GetClientEmailId(int id) { 
     //code 
    }   
} 

採取注意預期的網址在評論

你也應該Attribute Routing in ASP.NET Web API 2讀取多達路線模板更好地理解如何進行屬性路由。

0

您可以嘗試在控制器上使用路由前綴。

[RoutePrefix("api/v1/clients")] 
public class ClientsController : ApiController 
{ 
    // GET: api/Clients/5 
    [ResponseType(typeof(string))] 
    [Route("{id:int}/emailid"),HttpGet] 
    public IHttpActionResult GetClientEmailId(int id) 
    { 
     //code 
    }  
} 
0

你說:

在瀏覽器中如果鍵入http://localhost:54919/api/v1/clients/?id=1/getemailid它帶我去http://localhost:54919/api/v1/clients這不是我想要的。

從你的路由設置方式,它看起來像你需要去http://localhost:54919/api/v1/client/1/emailid得到你想要

爲了解釋這一差別的路線,當你調用http://localhost:54919/api/v1/clients/?id=1/getemailid將匹配的路由是這樣的:

[Route("api/v1/clients")] 
public IHttpActionResult GetClientEmailId(string id) 
{ 
    //code 
} 

,因爲你已經添加了id參數作爲查詢字符串參數。在這種情況下,id參數的值爲1/getemailid,這沒有多大意義。

使用路由參數(通過更換?id=1/getemailid1/emailid),你將你想要的路線實際上匹配