gpt4 book ai didi

asp.net-web-api - WebApi v2 属性路由的根前缀

转载 作者:行者123 更新时间:2023-12-02 15:56:33 25 4
gpt4 key购买 nike

我目前正在开发一个可扩展的 WebApi,其中各个动态加载的模块可以注册自己的路由。我的原始版本是使用 ASP.NET WebApi v1 使用基于 https://github.com/darrelmiller/ApiRouter 的技术构建的。但是我想使用 ASP.NET WebApi v2 提供的基于属性的路由

假设我有一个带有以下 Controller 的模块

[RoutePrefix("foo")]
public class FooController : ApiController {

[Route("{id}")]
public object GetFoo(int id) {
return id;
}
}

如果我只是调用config.MapHttpAttributeRoutes(),那么该 Controller 将绑定(bind)到http://localhost/foo/2。我想做的是以编程方式更改 Controller 的路由前缀。所以它应该希望绑定(bind)到类似 http://localhost/modules/FooModule/foo/2

有没有办法使用提供的工具来完成此任务,或者我必须继续使用原来的方法?

最佳答案

如果我没记错的话,你基本上是在寻找一个钩子(Hook),你可以在其中检查由 Web api 的属性路由探测机制生成的最终路由前缀或路由模板,并在将它们添加到路由表之前对其进行修改。通过这种方式,您可以插入具有属性 Controller 的第 3 方模块并修改其路由模板,以阻止它们与其他模块或您自己的应用程序的路由混淆......是这样吗?

Web API 提供了诸如 IRoutePrefixRoutePrefixAttribute(实现 IRoutePrefix)之类的类型,以支持创建自定义 RoutePrefix,您可以在其中更改路由前缀。但从您正在寻找的场景来看,我认为这不会有太大帮助。

不幸的是,我无法推荐 Web API 中的好方法来执行此操作。这种场景在设计时就出现过,但由于时间限制,我们无法提供必要的 Hook 。

更新:
根据您的评论,以下是我创建自定义路由属性并通过在将模块添加到路由表之前将模块名称添加到路由模板来修改模板的示例。正如我的评论中提到的,如果您拥有所有模块,您可以遵循这种方法,因为您可以使用此自定义路由属性。如果您期望使用第三方模块,那么您必须与他们达成协议(protocol),以便他们也使用相同的属性。但这很容易出错,就像他们不使用此自定义属性而是使用默认 RouteAttribute 的情况一样......

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public class MyRouteAttribute : Attribute, IDirectRouteFactory
{
private readonly string _template;

public MyRouteAttribute(string template)
{
_template = template;
}

public string Template
{
get { return _template; }
}

public string Name { get; set; }

public int Order { get; set; }

public virtual IDictionary<string, object> Defaults
{
get { return null; }
}

public virtual IDictionary<string, object> Constraints
{
get { return null; }
}

public virtual IDictionary<string, object> DataTokens
{
get { return null; }
}

public RouteEntry CreateRoute(DirectRouteFactoryContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}

IDirectRouteBuilder builder = context.CreateBuilder(Template);

//You would receive the final template..that is RoutePrefix + the route template
string finalTemplate = builder.Template;

//Modify this template to have your ModuleName
builder.Template = "modulename/" + finalTemplate;

builder.Name = Name;
builder.Order = Order;

IDictionary<string, object> builderDefaults = builder.Defaults;

if (builderDefaults == null)
{
builder.Defaults = Defaults;
}
else
{
IDictionary<string, object> defaults = Defaults;

if (defaults != null)
{
foreach (KeyValuePair<string, object> defaultItem in defaults)
{
builderDefaults[defaultItem.Key] = defaultItem.Value;
}
}
}

IDictionary<string, object> builderConstraints = builder.Constraints;

if (builderConstraints == null)
{
builder.Constraints = Constraints;
}
else
{
IDictionary<string, object> constraints = Constraints;

if (constraints != null)
{
foreach (KeyValuePair<string, object> constraint in constraints)
{
builderConstraints[constraint.Key] = constraint.Value;
}
}
}

IDictionary<string, object> builderDataTokens = builder.DataTokens;

if (builderDataTokens == null)
{
builder.DataTokens = DataTokens;
}
else
{
IDictionary<string, object> dataTokens = DataTokens;

if (dataTokens != null)
{
foreach (KeyValuePair<string, object> dataToken in dataTokens)
{
builderDataTokens[dataToken.Key] = dataToken.Value;
}
}
}

return builder.Build();
}
}

关于asp.net-web-api - WebApi v2 属性路由的根前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21784001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com