ASP.NET Web API属性路由到错误的行为

问题描述:

我已经在我的控制器上应用了属性路由,并且它正在发出错误的行为。我不知道我在哪里弄错了。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

您根据在行动路线调用了错误的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读取多达路线模板更好地理解如何进行属性路由。

您可以尝试在控制器上使用路由前缀。

[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 
    }  
} 

你说:

在浏览器中如果键入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),你将你想要的路线实际上匹配