在Web Api中组合路由映射

时间:2014-12-16 14:53:15

标签: c# asp.net-web-api owin asp.net-web-api-routing katana

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

1 个答案:

答案 0 :(得分:13)

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

可以找到解释here

在您的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();
    }
}

正如您所看到的,我已经使用RuotePrefix来设置端点并路由约束以限制参数,如文章中所建议的那样。 您甚至可以创建自己的自定义约束。

文章建议您必须安装 NuGet Microsoft.AspNet.WebApi.WebHost。 这不是必要的。