C# 了解WebApi如何路由请求

C# 了解WebApi如何路由请求,c#,asp.net-web-api,C#,Asp.net Web Api,我是WebApi新手,我遵循了本教程 一切正常-我有两个端点 api/products api/products/id 我试图理解的是它们与控制器中定义的方法的关系 例如,当我点击api/products端点时,运行的操作称为GetAllProducts 当我点击api/products/id端点时,运行的操作称为GetProduct 那么WebApi引擎如何知道如何将用户引导到这些端点呢 我的WebapiConfig.cs是 public static void Register(HttpC

我是WebApi新手,我遵循了本教程

一切正常-我有两个端点

api/products
api/products/id
我试图理解的是它们与控制器中定义的方法的关系

例如,当我点击api/products端点时,运行的操作称为GetAllProducts

当我点击api/products/id端点时,运行的操作称为GetProduct

那么WebApi引擎如何知道如何将用户引导到这些端点呢

我的WebapiConfig.cs是

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

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

Product[] products = new Product[]
{
    new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
    new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
    new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
};

public IEnumerable<Product> GetAllProducts()
{
    return products;
}

public IHttpActionResult GetProduct(int id)
{
    var product = products.FirstOrDefault((p) => p.Id == id);
    if (product == null)
    {
        return NotFound();
    }
    return Ok(product);
}
Product[]产品=新产品[]
{
新产品{Id=1,Name=“番茄汤”,Category=“杂货”,Price=1},
新产品{Id=2,Name=“Yo”,Category=“Toys”,Price=375万},
新产品{Id=3,Name=“Hammer”,Category=“Hardware”,Price=16.99M}
};
公共IEnumerable GetAllProducts()
{
退货产品;
}
公共IHttpActionResult GetProduct(int id)
{
var product=products.FirstOrDefault((p)=>p.Id==Id);
如果(产品==null)
{
返回NotFound();
}
返回Ok(产品);
}

一切都由路由的定义来控制。。。 正如您所看到的,ID参数是可选的。。因此,每当您点击请求api/产品时,您的请求将与路由表匹配,并且它会看到ID未传递,这是正常的,因为 它被定义为可选的。。。因此您的方法GetAllProducts被调用


然而,如果您在url中传递ID。。。您正在明确设置可选参数,该参数再次与您的路由匹配。。。这样,您就可以获得指定id的产品详细信息。

所有内容都受到控制,因为路由是如何定义的。。。 正如您所看到的,ID参数是可选的。。因此,每当您点击请求api/产品时,您的请求将与路由表匹配,并且它会看到ID未传递,这是正常的,因为 它被定义为可选的。。。因此您的方法GetAllProducts被调用


然而,如果您在url中传递ID。。。您正在明确设置可选参数,该参数再次与您的路由匹配。。。因此,您可以获得指定id的产品详细信息。

我想您会发现此链接非常有启发性:

要选择操作,请查看以下内容:

请求的HTTP方法

路由模板中的“{action}”占位符(如果存在)

控制器上操作的参数


在你的例子中,这是最后一个决定调用哪个方法的选项——正如Mike在评论中所说,它是基于签名的。

我想你会发现这个链接非常有启发性:

要选择操作,请查看以下内容:

请求的HTTP方法

路由模板中的“{action}”占位符(如果存在)

控制器上操作的参数


在您的情况下,它是决定调用哪个方法的最后一个选项——正如Mike在评论中所说,它基于签名。

您可以发布控制器代码吗?我希望它是根据您方法的签名。你有两个端点;一个接受id参数,另一个不接受。控制器中有两个功能;一个接受id参数,另一个不接受。不需要太多的处理能力就可以找到:)。是的,但如果我有其他端点,一个也需要id的端点,它如何知道路由到哪个端点?有没有任何地方可以描述这一点,而不是讽刺?@MikeMcCaughan一点帮助都没有,你没有回答发生了什么事情使它起作用,这是OP想知道的,这是一个好问题。@D.Foley你没有回答……这就是为什么它是一个评论。这是一个基于多年使用ASP.NETWebAPI经验的猜测。事实证明,这是一个正确的猜测。你能发布你的控制器代码吗?我希望它是通过你方法的签名。你有两个端点;一个接受id参数,另一个不接受。控制器中有两个功能;一个接受id参数,另一个不接受。不需要太多的处理能力就可以找到:)。是的,但如果我有其他端点,一个也需要id的端点,它如何知道路由到哪个端点?有没有任何地方可以描述这一点,而不是讽刺?@MikeMcCaughan一点帮助都没有,你没有回答发生了什么事情使它起作用,这是OP想知道的,这是一个好问题。@D.Foley你没有回答……这就是为什么它是一个评论。这是一个基于多年使用ASP.NETWebAPI经验的猜测。事实证明,这是一个正确的猜测。