【问题标题】:ASP.net WebAPI controller directory/ routingASP.net WebAPI 控制器目录/路由
【发布时间】:2013-11-18 23:35:38
【问题描述】:

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

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

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

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

示例网址调用:

api/controller/joinresultwithtable2

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      它允许您直接在操作方法上声明任何路由权(带参数)。这样您就可以很容易地控制如何使您的资源可用。

      如果您想对 API 进行版本控制,这也很容易,因为您可以在属性中包含版本

      【讨论】:

        【解决方案3】:

        如果您使用的是 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

        【讨论】:

          【解决方案4】:

          您也可以使用以下方法:

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

          【讨论】:

            猜你喜欢
            • 2015-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-14
            相关资源
            最近更新 更多