C# WebApi中路由映射的组合

C# WebApi中路由映射的组合,c#,asp.net-web-api,owin,asp.net-web-api-routing,katana,C#,Asp.net Web Api,Owin,Asp.net Web Api Routing,Katana,我正在WebApi Katana应用程序中使用路由。我有以下两个工作正常的路由映射。我的问题是,我是否可以使用可选参数将它们组合成一个路由映射?我看不到一个明显的方法来做到这一点,并保持所需的功能。我对这一点还不熟悉,可能错过了帮助我实现这一目标的技巧。如果路线必须保持这种方式,那么这不是问题 config.Routes.MapHttpRoute( name: "UnRegister", routeTemplate: "api/se

我正在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

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

可以找到解释

在Owin
启动中
必须使用以下命令启用属性路由:

您的控制器应该如下所示:

[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
来定义端点和路由约束以限制参数,如本文所建议的。 您甚至可以创建自己的自定义约束

文章建议您必须安装NuGet软件包
Microsoft.AspNet.WebApi.WebHost
。 没有必要,艾莫尔

[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();
    }
}