在 WebAPI 中组合路由映射

本文关键字:路由 映射 组合 WebAPI | 更新日期: 2023-09-27 18:34:25

我正在我的WebApi Katana应用程序中使用路由。我有以下两个工作正常的路由映射。我的问题是,我可以使用可选参数将它们合并到单个路由映射中吗?我看不到一种明显的方法来做到这一点并保持所需的功能。我是新手,可能错过了帮助我实现这一目标的技术。如果路线必须保持这种方式,那么这不是问题。

        config.Routes.MapHttpRoute(
            name: "UnRegister",
            routeTemplate: "api/services/{serviceName}/{location}",
            defaults: new {controller = "MyController", location = RouteParameter.Optional});
        config.Routes.MapHttpRoute(
            name: "UnRegister2",
            routeTemplate: "api/services/{serviceName}/{instanceId}",
            defaults: new { controller = "MyController" });

所需的功能是通过提供以下详细信息来注销服务:

Servicename
Servicename and location
Servicename and instanceId

在 WebAPI 中组合路由映射

Web API 2 ASP.NET 中,您可以使用属性路由,而不必使用 MapHttpRoute 以这种方式定义所有路由。

解释可以在这里找到。

在 Owin Startup 中,您必须使用 MapHttpAttributeRoutes 启用属性路由:

public class Startup
{
    public static void Configuration(IAppBuilder app)
    {
        // Configure Web API for self-host. 
        HttpConfiguration config = new HttpConfiguration();
        //  Enable attribute based routing
        config.MapHttpAttributeRoutes();
        app.UseWebApi(config);
    }
}

您的控制器应如下所示:

[RoutePrefix("api/service")]
public class ServicesController : ApiController
{
    [HttpGet]
    [Route("{location}")]
    public IHttpActionResult GetByLocation(string location)
    {
        return Ok();
    }
    [HttpGet]
    [Route("{instanceId:int}")]
    public IHttpActionResult GetByInstanceId(int instanceId)
    {
        return Ok();
    }
}

如您所见,我已使用 RoutePrefix 来定义终结点和路由约束来限制参数,如本文中所述。您甚至可以创建自己的自定义约束。

本文建议您必须安装 NuGetMicrosoft.AspNet.WebApi.WebHost。那没必要。