gpt4 book ai didi

c# - 从 ApiController 和 Action 名称中获取 Url,在包含 Controllers 和 ApiControllers 的项目中

转载 作者:可可西里 更新时间:2023-11-01 09:09:54 32 4
gpt4 key购买 nike

现有项目的 Controller 继承自:

  • Controller:RouteTable.Routes.MapRoute with "{controller}/{action}/{id}"
  • ApiController:GlobalConfiguration.Configure 并在回调 MapRoute 中使用 "api/{controller}/{id}"

一切正常,但我需要为这两种类型的 Controller 中的操作方法生成 URL。鉴于:

  1. 继承自其中任何一个的 Controller 的名称或类型,以及
  2. 一个 Action 方法名

那么从网站端,如何为 Web API 端生成正确的 URL?

我现在正在使用反射来获取操作和 Controller 名称,然后通过使用 UrlHelper.Action(actionName, controllerName, routeValueDictionary) 获取网站路由的正确 URL。

但是,此方法(当然)为 WebAPI 端生成这样的 URL:/ApiControllerName/Get?parameter1=value 当它需要是 /api/ApiControllerName?parameter1 =value 以及它是 GET 请求的单独知识。

目的:这是用于网站的冒烟测试页面,该页面使用属性和反射来决定冒烟测试的内容。能够在整个项目中使用相同的属性会很好,而且能够使用正确的 UrlHelper 会非常好,它知道路由表并且可以产生正确的前缀,如 /api/,而不是假设 API 路由是使用 api 而不是 webapi 注册的代码,这可能是错误的>.

更新

经过继续研究,我发现了 the Url.HttpRouteUrl method它可以生成 WebAPI URL,但这需要知道路由名称,而不是操作方法名称。

我对此进行了更多研究,但尚未接近解决方案。看起来如果您知道相应路线的路线名称,you can cook up a Url easily .还有一些可能的提示herehere .但是如果 WebApi 有多个路由,你怎么知道哪一个匹配你想要的 Controller 和 Action 呢?重新实现 MVC 本身已经在选择 Controller 和操作方面所做的事情是愚蠢的。我想我可以使用每个 WebApi 路由从给定参数构建一个 URL,然后按其步调运行 URL(使用上面的一些链接)并查看它是否会与所需的 Controller 匹配......糟糕。

必须有更简单的方法。

现在我必须继续前进,但希望有人能帮助我。

最佳答案

这里有几种方法:

  • 使用 RouteUrl() 方法:

    var url1 = Url.RouteUrl(new { id = 1, controller = "...",  httproute = true });

技巧当然是httproute = true。设置此属性,即表示您只需要 http 路由(Web Api 路由)。

  • 使用 HttpRouteUrl() 方法:

    var url2 = Url.HttpRouteUrl(null, new { id = 2, controller = ".." });
  • 另一种直接使用路由和 httproute 值的方法:

    var values = new RouteValueDictionary(new
    {
    id = 3,
    controller = "...",
    httproute = true
    });
    var url3 = RouteTable.Routes.GetVirtualPath(Request.RequestContext, values).VirtualPath;

3种方式基本相同。由于您没有指定路由,系统将尝试根据路由值找到第一个匹配项。例如,假设您有一个名为 RestfulControllerApiController 并且 web api 路由配置如下:

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

使用第一种方法,当你在 MVC Controllerurl中的值为/api/restful/123

但是如果你添加一个新路由ConstraintApi:

config.Routes.MapHttpRoute(
name: "ConstraintApi",
routeTemplate: "api2/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { controller = "restful" }
);

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

RouteUrl返回的url是/api2/restful/123

您在声明路线时应该注意顺序。如果在路由ConstraintApi之前添加路由DefaultApi,则生成的url为/api/restful/123

关于c# - 从 ApiController 和 Action 名称中获取 Url,在包含 Controllers 和 ApiControllers 的项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35905577/

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