Объединение сопоставлений маршрутов в WebApi

Я использую маршрутизацию в приложении 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

В ASP.NET Web API 2 вы можете использовать атрибутную маршрутизацию, и вам не нужно определять все ваши маршруты таким образом с помощью 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 для определения конечной точки и ограничений маршрута для ограничения параметров, как предложено в статье. Вы даже можете создавать свои собственные пользовательские ограничения.

В статье предлагается установить пакет NuGet Microsoft.AspNet.WebApi.WebHost. Это не обязательно aymore.