2016-06-10 60 views
0

我有这样的路线:网页API路由约束元组

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

对于tenantParam1和tenantParam2,我需要这样只有值的某些元组被允许约束它们。有没有办法做到这一点?

编辑:为了澄清,重要的是我需要将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

链路只回答不喜欢,但我不会粘贴整个后在这里,所以只需阅读: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匹配方法。它只需要这样注册:'constraints:new {tenantParam1 = new TenantConstraint()}' – ConditionRacer

+1

你可以传入多个参数,这一切都取决于你如何设置和装饰你的路线 –