如何创建 ASP.NET Web API 网址?
Posted
技术标签:
【中文标题】如何创建 ASP.NET Web API 网址?【英文标题】:How to create ASP.NET Web API Url? 【发布时间】:2012-03-19 03:02:48 【问题描述】:在 ASP.NET MVC 中,我们有 @Url.Action
用于操作。是否有类似@Url.Api
的东西会路由到/api/controller?
【问题讨论】:
【参考方案1】:ApiController 有一个名为 Url 的属性,它的类型为 System.Web.Http.Routing.UrlHelper,它允许您为 api 控制器构造 url。
例子:
public class ValuesController : ApiController
// GET /api/values
public IEnumerable<string> Get()
// returns /api/values/123
string url = Url.Route("DefaultApi", new controller = "values", id = "123" );
return new string[] "value1", "value2" ;
// GET /api/values/5
public string Get(int id)
return "value";
...
这个 UrlHelper 既不存在于您的视图中,也不存在于标准控制器中。
更新:
为了在 ApiController 之外进行路由,您可以执行以下操作:
public class HomeController : Controller
public ActionResult Index()
string url = Url.RouteUrl(
"DefaultApi",
new httproute = "", controller = "values", id = "123"
);
return View();
或在视图内:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new httproute = "", controller = "values", id = "123" )';
$.ajax(
url: url,
type: 'GET',
success: function(result)
// ...
);
</script>
注意httproute = ""
路由标记,这很重要。
显然,这假设您的 Api 路由在 Global.asax
的 RegisterRoutes 方法中称为 DefaultApi
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
);
【讨论】:
那.. 真的对我没有多大帮助,因为我需要我的 View 能够以安全的方式生成 Url。如果有 Go Live 许可证,在 View 上创建 URL 的“Go Live”方式是什么? 更重要的是,如果您使用的是 ASP.Net 开发服务器,这将不起作用,因为它一直在更改端口,因此您甚至无法在视图中硬核化 url。 @ShaneCourtrille,我已经更新了我的答案,以说明如何使用普通的System.Web.Mvc.UrlHelper
在 HttpControllerContext 之外生成 Api 路由。
非常感谢!我尝试使用 RouteUrl,但不知道 httproute 参数要求。
我了解样本的目的;我的意思是,如果您输入一行 ViewBag 代码,这将是一个更有用的示例,因为您将证明 此值是我们在可能的情况下试图获得的值,而不仅仅是执行一些任意代码。同样,如果我没有浪费几分钟没有意识到我错过了什么,然后我终于认识到特定的代码行是相关的,我就不会发表评论了。【参考方案2】:
它适用于Url.Action
的简单形式,因此您不必引用任何路由名称:
Url.Action("ActionName", "ControllerName", new httproute = "DefaultApi" )
如果区域内需要 URL,您可能需要添加 area = ""
。 (默认情况下,Api 控制器位于区域之外。)我使用的是 MVC 4。
【讨论】:
Web Api中的UrlHelper是msdn.microsoft.com/en-us/library/…,它没有action方法。 @YuriyFaktorovich 这篇文章暗示Url.Action
正在从视图中使用。 Url
是 System.Web.Mvc.UrlHelper
类型,它不映射到 WebApi
路由。这就是您需要额外参数的原因:new httproute = ""
。
我添加了httproute""
,但它不是映射=/
我必须添加带有空白区域和 null htmlAttributes @Html.ActionLink("link", "Get", "Servers", new id = r.idServer, area = "", httproute = "" , null)
的链接,但效果很好
这从一个视图中完美运行,但是,我不确定它为什么将操作的名称生成为查询字符串,例如:/api/dashboard?action=getdata。我期待这个:/api/dashboard/getdata【参考方案3】:
希望能够以类型安全的方式生成链接,而无需硬编码字符串(控制器名称)?
有一个 nuget ! (由 Mark Seeman 撰写)
https://github.com/ploeh/Hyprlinkr
像这样工作:
路线,像往常一样:
name: "API Default",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
获取网址:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
结果:
http://localhost/api/foo/1337
【讨论】:
【参考方案4】:这是回答问题的KISS方法:
如果这是您将用于创建 MVC 控制器 URL 的代码
@Url.Action("Edit", "MyController")
为了获取控制器的 API 版本的 URL(假设您使用相同的控制器名称),您可以使用
@Url.Action("Edit", "api/MyController")
Url.Action 方法所做的只是附加应用程序的根路径,带有控制器名称,后跟动作名称(除非它是“索引”,在这种情况下不附加。如果路由值对象具有 id 属性,该值也附加到 URL。
【讨论】:
谢谢!我的控制器名称前缺少api/
。以上是关于如何创建 ASP.NET Web API 网址?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用ASP.NET Core Web API实现短链接服务
Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]