现有项目的 Controller 继承自:
Controller:RouteTable.Routes.MapRoute with "{controller}/{action}/{id}"。ApiController:GlobalConfiguration.Configure 并在回调 MapRoute 中使用 "api/{controller}/{id}"。一切正常,但我需要为这两种类型的 Controller 中的操作方法生成 URL。鉴于:
那么从网站端,如何为 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 .还有一些可能的提示here和 here .但是如果 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种方式基本相同。由于您没有指定路由,系统将尝试根据路由值找到第一个匹配项。例如,假设您有一个名为 RestfulController 的 ApiController 并且 web api 路由配置如下:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
使用第一种方法,当你在 MVC Controller,url中的值为/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/
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc