Html.RouteLink到Web API路由 - 可能吗?

And*_*tan 3 asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

我的网站主要是通过Asp.Net Web API公开的一套Web服务.还有一些页面,旨在支持用Razor(以及隐式的Asp.Net MVC 4)编写的Web服务(测试等).

对于webservices的XML版本,我有一个模式导出操作(使用XsdDataContractExporter),这是由我的标准API路由选择的(尽管注意 - 我已经颠覆了Web API和Pages的优先级):

//page routes
routes.MapRoute(
    "Default", // Route name
    "pages/{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", 
          action = "Index", 
          id = UrlParameter.Optional 
        } // Parameter defaults
);

//an additional route for my Schema controller action
routes.MapHttpRoute("XSD", "schema.xsd",
    new { controller = "schema" });

//API Catch-all Route
routes.MapHttpRoute("APIMain", "{controller}/{id}",
    new { id = RouteParameter.Optional });
Run Code Online (Sandbox Code Playgroud)

现在在剃刀页面上,我想发出一个指向"友好"架构URL的链接~/Schema.xsd.预测路线发现的问题我立即直接按名称命中路线:

@Html.RouteLink("Schema", "XSD");
Run Code Online (Sandbox Code Playgroud)

然而,这只是发出相当于的链接~/.

我已经尝试了一些路由值的其他组合 - 但它看起来像MVC HtmlHelper并且UrlHelper根本不想选择Web API路由.

我敢肯定,如果我破解了Asp.Net MVC 4的来源我会找到原因 - 但我希望有人已经知道了,因为我找不到另一个关于这种交联的SO我认为它' d是SO库的一个很好的补充.

我应该添加浏览~/Schema~/Schema.xsd正确显示API操作生成的XML模式.

And*_*tan 5

更新

后RC的方法加入MVC的UrlHelper,HttpRouteUrl,这不正是我建议在这里这个答案同样的事情. 这是我在CodePlex 上的讨论主题,我被告知了这一点.因此,您无需使用此处提到的魔术字符串来生成Web API路由的链接.

原始答案

我设法让它工作 - 虽然它可能不是MVC 4时RTMd(免责声明免责声明!)

我更改了我的Html.RouteLink调用,如下所示:

@Html.RouteLink("XML request schema", "XSD", new { httproute = true })
Run Code Online (Sandbox Code Playgroud)

我原本打算不打算立即回答我自己的问题 - 但做了一些研究后我找到了答案.

首先,我验证了HtmlHelper路径集合与RouteTable.Routes集合相同(即包含所有路径).

在调用链之后,我记得曾经从CodePlex搜索当前的Web API和页面MVC 4源代码,HttpRoutes(in System.Web.Http.Routing)需要添加一个"隐藏"的路由值,否则它们永远不会匹配.这是来自第21-25行的源代码HttpRoute(截至2012年6月8日来源正确):

/// <summary>
/// Key used to signify that a route URL generation request should include HTTP routes (e.g. Web API).
/// If this key is not specified then no HTTP routes will match.
/// </summary>
internal const string HttpRouteKey = "httproute";
Run Code Online (Sandbox Code Playgroud)

对代码的进一步分析表明,它希望这个路由值是一个布尔值.

显然,这可以转化为扩展方法 - 可能Html.HttpRouteLink(和Html.HttpActionLink) - 使用额外的扩展UrlHelper来隐藏路由数据值的魔术字符串.