如何创建 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 正在从视图中使用。 UrlSystem.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 官网菜鸟学习系列导航[持续更新中]

Web API系列教程2.2 — ASP.NET Web API中的路由和动作选择机制

Web API1.1 ASP.NET Web API入门

vs2005如何建立一个WEB站点?

JQuery + ASP.Net Web API一个简单应用