2016-06-10 3 views
0

У меня есть маршрут, как это:Web Api маршрут ограничение кортежи

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{tenantParam1}/{tenantParam2}/{controller}/{id}, 
    constraints: ???, 
    defaults: new { id = RouteParameter.Optional } 
); 

Для tenantParam1 и tenantParam2, мне нужно, чтобы ограничить их так, что только определенные наборы значений допускаются. Есть ли способ сделать это?

Edit: выяснить, важной частью является то, что мне нужно оценить tenantParam1 и tenantParam2 вместе, как кортеж. Например, позволяет сказать, что это мои действительные арендаторы:

param1 | param2 
ABC | 123 
ABC | 456 
DEF | 789 
DEF | 012 

Это будет означать следующие маршруты действительны:

/api/ABC/123 
/api/ABC/456 
/api/DEF/789 
/api/DEF/012 

Но следующие маршруты не действуют:

/api/ABC/789 
/api/ABC/012 
/api/DEF/123 
/api/DEF/456 
+1

Link-только ответы не понравилось, но я не буду вставлять весь пост здесь, так что просто прочитать: https://chsakell.com/2013/10/13/web-api-custom-routing-constraints/ –

+0

Спасибо, но это только кажется, чтобы покрыть собственные ограничения для одного параметра. Мне нужно сдержать два параметра вместе как кортеж. – ConditionRacer

ответ

1

Этот это всего лишь пример, который вам нужно подкрутить в соответствии с вашими потребностями. Создание ограничений класса

public class SomeConstraint : IHttpRouteConstraint 
{ 
    public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, 
     IDictionary<string, object> values, HttpRouteDirection routeDirection) 
    { 
     //get value from values dictionary object 
     //return true or false 
     //false will block the call 
    } 
} 

Затем зарегистрировать его в конфигурационном файле

public static void Register(HttpConfiguration config) 
    { 
     var constraintResolver = new DefaultInlineConstraintResolver(); 
     constraintResolver.ConstraintMap.Add("someConstraint", typeof(SomeConstraint)); 

     config.MapHttpAttributeRoutes(constraintResolver); 
    } 

и использовать его, как показано ниже

[Route("{value:someConstraint}")] 
+0

Это позволяет мне ограничивать только один параметр за раз. Мне нужно ограничение, которое позволит мне оценить tenantParam1 и tenantParam2 вместе – ConditionRacer

+0

Похоже, это все еще можно использовать, так как все значения маршрута передаются в 'метод Match'. Он просто должен быть зарегистрирован как это: 'ограничения: новый {tenantParam1 = новый TenantConstraint()}' – ConditionRacer

+1

точно и может проходить в нескольких параметров, все зависит, как у установить и украсить ур маршрут –

Смежные вопросы