【问题标题】:How does ASP.net web API determine which function to call?ASP.net Web API 如何确定调用哪个函数?
【发布时间】:2014-07-29 21:34:16
【问题描述】:

我的 ASP.NET web api 有两个功能:一个返回所有产品的列表,另一个返回一个取决于条件的列表。

public class ProductsController : ApiController
{
    List<Product> lst = new List<Product>
    {
        new Product(){ Id = 1, Name = "a Soup", Category = "Groceries", Price = 1 },
        new Product(){Id = 2, Name = "b Soup", Category = "stat", Price = 4 },
        new Product(){ Id = 3, Name = "c Soup", Category = "Groceries", Price = 1 }
     };

     public List<Product> GetAllProducts()
     {
         return lst;
     }

     public List<Product> GetProducts(int k)
     {
         return lst.Where(p => p.Price == k).ToList();
     }
}

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

我正在使用 jQuery 的 GET 方法,如下所示:

 <script type="text/javascript">
    function getProducts() {
        $.getJSON("api/products/1",
            function (data) {
                debugger;
            });
    }
    $(document).ready(getProducts);
</script>

这个函数会调用第一个函数,即 GetAllProducts,即使我通过调用它来调用它

"api/products/1"

我的问题是它如何确定从客户端调用时调用哪个函数?

【问题讨论】:

  • 你检查你的RouteConfig.cs文件了吗?
  • 嗨罗伯特,刚刚更新了路由配置
  • 如果你用console.log(data);代替调试器并检查响应?
  • 我得到了 3 个对象而不是一个
  • 根据默认路由设置..你应该有4个方法(GET,POST,PUT,DELETE)。如果要调用自己的方法,需要在 route.config 文件中指定自定义路由。

标签: jquery asp.net


【解决方案1】:

如果您使用的是最新版本的 Web API,您可以查看Attribute Routing。这将允许您使用相关模式来装饰方法。

 [Route("products/getAll")]
 public List<Product> GetAllProducts()
 {
     return lst;
 }

 [Route("products/getByPrice/{price}")]
 public List<Product> GetProducts(int price)
 {
     return lst.Where(p => p.Price == price).ToList();
 }

以上只是一个示例,因此您可以选择适合您需要的内容。如果您使用的是旧版本,您可以获取AttributeRouting library here

您还有一个ActionPresedence,请参阅my question here

【讨论】:

    【解决方案2】:

    Web API 框架使用 WebApiConfig.cs 文件中定义的路由表,该文件位于 App_Start 目录中。

    Web API 的 Visual Studio 项目模板创建默认路由:

    routes.MapHttpRoute(
        name: "API Default",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    

    当 Web API 收到 HTTP 请求时,它会尝试将 URI 与路由表中的路由模板之一进行匹配。

    如果没有路由匹配,客户端会收到 404 错误。例如,以下 URI 匹配默认路由:

    /api/contacts
    /api/contacts/1
    /api/products/gizmo1
    

    但是,以下 URI 不匹配,因为它缺少“api”段:

    /contacts/1
    

    在您的情况下,您有一个名为 Products 的控制器和两个 Get 方法。这符合约定,Web Api 使用第一个。

    【讨论】:

      【解决方案3】:

      这个控制器中有很多Get 方法。 Web API 是 Restful,然后当您调用服务器时,它将返回名为 Get 的第一个方法,在您的情况下为 GetAllProducts。可以直接调用其他方法:

      function getProducts() {
          $.getJSON("api/products/GetProducts/1",
              function (data) {
                  debugger;
              });
      }
      

      如果您使用的是WebAPI v2.0,您可以使用属性路由为控制器中的每个方法设置默认路由:

      [Route("api/products/{k}")]
      public List<Product> GetProducts(int k)
      {
          return lst.Where(p => p.Price == k).ToList();
      }
      

      然后就可以调用“api/products/1”了。

      【讨论】:

        猜你喜欢
        • 2019-06-02
        • 1970-01-01
        • 2010-12-19
        • 2010-11-15
        • 2015-12-21
        • 2016-12-21
        • 2015-03-02
        • 2017-08-01
        • 1970-01-01
        相关资源
        最近更新 更多