ASP.net Web API如何确定要调用哪个函数?

时间:2014-07-29 13:09:39

标签: jquery asp.net

我的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>

这个函数调用第一个函数Ge​​tAllProducts即使我通过调用

调用它
"api/products/1"

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

3 个答案:

答案 0 :(得分:2)

如果您使用的是最新版本的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

答案 1 :(得分:0)

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

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

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

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

然后你可以打电话给“api / products / 1”。

答案 2 :(得分:0)

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不匹配,因为它缺少&#34; api&#34;段:

/contacts/1

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