ASP.net WebAPI控制器目录/路由

时间:2013-11-18 23:35:39

标签: c# asp.net web-services asp.net-web-api controller

我正在尝试做类似于本网站上的建议 https://mathieu.fenniak.net/stop-designing-fragile-web-apis/

它表明这是一个更好的网址

http://api.fbi.gov/wanted/most

我的问题是如何在ASP.NET WEBAPI中执行类似的操作。例如,如果我想返回一个特定的查询,用一个表连接一些数据,而不是传入一个参数,我只想要一个方法url调用,只需要我想要的一个查询。完成此任务的最简单方法是什么?

示例网址调用:

API /控制器/ joinresultwithtable2

4 个答案:

答案 0 :(得分:2)

最简单的方法可能是属性路由。 您可以在此处找到更多信息:http://attributerouting.net/

它允许您直接在操作方法上声明任何路径(带参数)。这样,您可以非常轻松地控制资源的可用性。

如果您想要对API进行版本控制,也很容易,因为您只需在属性中包含该版本

答案 1 :(得分:2)

如果您使用的是ASP.NET Web API 2,则可以执行以下操作:

[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

来源:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

答案 2 :(得分:2)

它不是很漂亮,但您可以设置路由,以便特定路径映射到特定的控制器和操作。

        config.Routes.MapHttpRoute("query1", "query/query1", new {controller="StockQueries", action="query1"});
        config.Routes.MapHttpRoute("query2", "query/query2", new { controller = "StockQueries", action = "query2" });
        config.Routes.MapHttpRoute("query3", "query/query3", new { controller = "StockQueries", action = "query3" });

然后有一个看起来像这样的控制器,

public class StockQueriesController : ApiController
{
    [ActionName("query1")]
    public HttpResponseMessage GetQuery1()
    {
        return new HttpResponseMessage() {Content = new StringContent("Query1")};
    }

    [ActionName("query2")]
    public HttpResponseMessage GetQuery2()
    {
        return new HttpResponseMessage() { Content = new StringContent("Query1") };
    }

    [ActionName("query3")]
    public HttpResponseMessage GetQuery3()
    {
        return new HttpResponseMessage() { Content = new StringContent("Query1") };
    }
    [ActionName("query4")]
    public HttpResponseMessage GetQuery4()
    {
        return new HttpResponseMessage() { Content = new StringContent("Query1") };
    }
}

答案 3 :(得分:0)

您还可以使用以下方法:

[ActionName("DefaultApi")]
[Route("Api/UserLogin/DefaultApi/UserDetails")] 
public IHttpActionResult UserDetails(){
  return Ok(db.UserLogins.ToList());
}