[英]Using ASP.NET WebApi, how can I make a route exclude a set of controllers?
我已经创建了两个用于导出类型模式和wadl的控制器,其他所有内容都属于api
因此,我创建了三个路由,两个用于特殊控制器(Schema和Wadl),一个用于“其他所有东西”:
config.Routes.MapHttpRoute(
name: "Schemas",
routeTemplate: "api/{controller}/{typeName}/{subType}",
defaults: new { subtype = RouteParameter.Optional },
constraints: new { controller = @"Schemas" }
);
config.Routes.MapHttpRoute(
name: "Wadl",
routeTemplate: "api/{controller}",
defaults: null,
constraints: new { controller = @"Wadl" }
);
config.Routes.MapHttpRoute(
name: "api",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: somethingsomethingsomething }
);
我尝试过以下页面: http : //stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints
并在其NotEquals
类上创建了一个变体:
public class NotEqual : IRouteConstraint
{
private IEnumerable<string> Matches;
public NotEqual(IEnumerable<string> matches)
{
Matches = matches;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
bool output = true;
var name = values[parameterName].ToString();
foreach (var match in Matches)
{
if (name.Contains(match))
{
output = false;
break;
}
}
return output;
}
}
并将第三条路线更改为:
config.Routes.MapHttpRoute(
name: "api",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { controller = new NotEqual(new List<string> { "Schemas", "Wadl" }) }
);
public class NotEqual : IRouteConstraint
{
private IEnumerable<string> Matches;
public NotEqual(IEnumerable<string> matches)
{
Matches = matches;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
bool output = true;
var name = values[parameterName].ToString();
foreach (var match in Matches)
{
if (name.Contains(match))
{
output = false;
break;
}
}
return output;
}
}
不起作用,仍然对所有三个控制器都匹配
只需一种方法,它就可以很好地工作,但是自动帮助页面却很丑陋且具有误导性。
如果我在Match
休息一下,它不会达到断点。
正则表达式约束完美运行,只是“其他”约束不起作用
为什么这样不起作用?
这是我自己的其他答案的组合:
在Register()中具有以下内容:
config.Routes.MapHttpRoute(
name: "default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { controller = @"^(?:(?!Wadl|Schemas).)*$" }
);
config.MapHttpAttributeRoutes();
<snip>
config.EnsureInitialized();
这为您提供了控制器的默认路由,您可以通过添加更多|来排除它们。 对正则表达式的声明。
然后,要进行自定义路由而不必担心优先级,请标记您的操作,如下所示:
[Route("schemas/{typeName}")]
public XmlSchema GetSchema(string typeName) {}
[Route("schemas/{typeName}/{subType}")]
public XmlSchema GetSchema(string typeName, int subType)
这些控制器中未标记的方法将没有通往它们的路由,就像它们是私有的一样。
public string Test(int id)
第二条路由比最后一条更通用,因为它在与id匹配的一条之前注册。 只需将第二个移动到底部并构建您的应用程序即可。 至于约束,您可以使用诸如new {id = @"\\d+" }
但这仅在您具有相同格式且URL中数据类型不同的情况下才有效,例如api / myController / 123,api / myController / my Name 。 等等
老实说,如果可以的话,您应该使用AttributeRouting
它在代码中更加清晰,对于项目新手来说,更容易看到什么路线在起作用。
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.