gpt4 book ai didi

c# - 使用 RouteAttribute 或隐式路由时的 WebApi 路径差异

转载 作者:太空宇宙 更新时间:2023-11-03 15:22:11 25 4
gpt4 key购买 nike

我一直在使用 WebApi,我试图了解使用路由属性与让 WebApi 根据函数名称自动创建路由的区别。我有很多这种形式的 Controller :

public class MyController : RestControllerBase
{
public async Task<HttpResponseMessage> GetData()
{
return _data;
}

[Route(ApiVersion.Version + "/MyController/{param}/specific/route")]
public async Task<HttpResponseMessage> GetMoreData()
{
return _moreData;
}
}

这个 Controller 和其他 Controller 都指定了一个路由注册表:

routingManager.RegisterVersionedHttpRoute(
routeName: "MyController",
routeTemplate: "MyController/{param}",
defaults: new { controller = "MyController", param = RouteParameter.Optional },
version: ApiVersion.Version);

当我构建和测试我的 API 时,两个端点都可以正确访问。

我还用一个基于 namespace (用于版本控制)的 HttpControllerSelector 覆盖。

我的问题是,这两个路由除了被特定的 http 路由调用的传统功能外,还有不同的行为。例如,在我重写的 Controller 选择器中,我必须编写此逻辑以使 Controller 和路由正确映射:

private string GetControllerName(IHttpRouteData routeData)
{
if (routeData.GetSubRoutes() != null)
{
// With route attribute
var subroute = routeData.GetSubRoutes().FirstOrDefault();
var dataTokenValue = subroute.Route.DataTokens["actions"];
if (dataTokenValue == null) return null;
var controllername = ((HttpActionDescriptor[])dataTokenValue).First().ControllerDescriptor.ControllerName.Replace("Controller", string.Empty);
return controllername;
}
else
{
// Try Strategy for without route attribute.
return (String)routeData.Values["controller"];
}
}

private string GetVersion(IHttpRouteData routeData)
{
var routeTemplate = "";
if (routeData.GetSubRoutes() != null)
{
var subRouteData = routeData.GetSubRoutes().FirstOrDefault();
if (subRouteData == null) return null;
routeTemplate = subRouteData.Route.RouteTemplate;
}
else
{
routeTemplate = routeData.Route.RouteTemplate;
}

var index = routeTemplate.IndexOf("/");
if (index == -1)
{
return Unversioned;
}
var version = routeTemplate.Substring(0, index).ToUpperInvariant();
return version;
}

似乎具有显式属性的路由将有一个 route.GetSubroutes() 可用,而隐式路由则不会。这导致我编写了两种不同的方法来从传入请求中提取版本和 Controller 名称,然后才能正确路由它们。我可以接受这一点,但 WebApi 内部的某些东西正在路由之间产生这种区别,这真的让我很困扰。

不幸的是,我随后开始使用 https://github.com/domaindrivendev/Swashbuckle记录我的 api 并遇到类似的问题。 swagger 页面为具有 Route 属性的路由正确生成,但完全忽略隐式路由。我怀疑导致此问题的问题与导致我的选择逻辑中出现分支的问题相同。

我一直在挖掘尽可能多的 ApiExplorer、WebAPI 和其他在线文档,但我一直无法找到使隐式/显式路由方法同质化的解决方案。它甚至可能是他们实现中的错误。

我应该从这里去哪里?

最佳答案

所以这里的答案是 Web Api 2 存在错误或不一致要验证,您可以运行此代码片段。在我提到的情况下,ApiExplorer 不会返回未明确标记路由属性的路径的结果。

        IApiExplorer apiExplorer = configuration.Services.GetApiExplorer();
foreach (ApiDescription api in apiExplorer.ApiDescriptions)
{
Console.WriteLine("Uri path: {0}", api.RelativePath);
Console.WriteLine("HTTP method: {0}", api.HttpMethod);
foreach (ApiParameterDescription parameter in api.ParameterDescriptions)
{
Console.WriteLine("Parameter: {0} - {1}", parameter.Name, parameter.Source);
}
Console.WriteLine();
}

关于c# - 使用 RouteAttribute 或隐式路由时的 WebApi 路径差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36797991/

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