在Web API开发中,路由约束是控制HTTP请求如何映射到控制器动作的重要机制。本文将详细介绍路由约束的概念、不同类型的约束,并指导如何创建自定义路由约束。
路由约束是Web API中用于限制URL参数的机制,它确保传入的URL参数符合特定的格式或条件。在讨论路由约束之前,先简要了解属性路由。属性路由是Web API2中引入的一种路由方式,它允许开发者通过属性来定义路由模板。
属性路由允许开发者定义路由模板,从而实现资源的层次结构管理。以下是一个简单的示例代码:
public IEnumerable<ServerData> GetServerData(int type)
{
return ServerDataRepository.GetAll().Where(d => d.Type == type);
}
通过这种方式,可以轻松定义URI模式并管理资源。
假设有一个复杂的URI,其中参数可以是任何类型(如int或string)。以下是一个示例代码:
public IEnumerable<DataDetail> GetDataDetailsByType(int type)
{
// some stuff here
}
当请求到来时,Web API会尝试匹配定义在路由模板中的URI。可以传递不同的值来使这个模板有效:
在这个URI路由模板中,{type}是一个参数(通常称之为URI占位符),当传递值时,它会自动分配给动作方法的参数。
在上述URI路由模板中,{type}是一个参数,当传递"external"时,模板匹配成功,但实际上参数是int类型。这里的问题显而易见:需要一种机制来限制参数,以确保Web API匹配正确的URI路由模板。这就是路由约束的作用。
以下是一些常用的路由约束:
除了上述约束,还有一些其他约束,如regex、maxlength、minlength等,这些约束的名称已经很清楚地说明了它们的用途。
虽然有很多内置的路由约束可用,但在某些场景下,可能需要一些特殊的约束。为了满足这些需求,可以创建自定义约束。
创建自定义路由约束的第一步是实现IHttpRouteConstraint接口。以下是一个示例代码,展示了如何创建一个限制不良词汇的自定义约束:
public class NoBadWordsConstraint : IHttpRouteConstraint
{
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
object value;
string[] badWords = new string[] { "bad1", "bad2", "bad3" };
if (values.TryGetValue(parameterName, out value) && value != null)
{
string stringValue;
if (value is string)
{
stringValue = (string)value;
foreach (var w in badWords)
{
if (w.Contains(stringValue))
return false;
}
return true;
}
}
return false;
}
}
要使用这个自定义约束,需要先在WebApiConfig类中的Register方法中注册它:
var defaultconstraintResolver = new DefaultInlineConstraintResolver();
defaultconstraintResolver.ConstraintMap.Add("nobadword", typeof(NoBadWordsConstraint));
config.MapHttpAttributeRoutes(defaultconstraintResolver);
[Route("serverdata/{word:length(10)}")]
public IEnumerable<EmployeeData> GetEmployeebyword(string word)
{
// some stuff here
}