3

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

对于 web 服务的 XML 版本,我有一个模式导出操作(使用XsdDataContractExporter),它由我的标准 API 路由拾取(尽管注意 - 我已经翻转了 Web API 和页面的优先级):

//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 });

现在在剃须刀页面上,我想发出一个指向“友好”架构 URL 的链接~/Schema.xsd。预料到路由发现的问题,我立即按名称直接点击路由:

@Html.RouteLink("Schema", "XSD");

然而,这只是发出一个相当于~/.

我尝试了其他一些路由值组合 - 但它似乎是 MVCHtmlHelper并且UrlHelper根本不想选择 Web API 路由。

我敢肯定,如果我破解了 Asp.Net MVC 4 的源代码,我会找到原因——但我希望有人已经知道,因为我找不到关于这种交叉链接的另一个 SO,所以我想通了。 d 是 SO 库的一个很好的补充。

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

4

1 回答 1

5

更新

Post-RC 一个方法被添加到 MVC 的UrlHelper,HttpRouteUrl中,这与我在这个答案中建议的完全一样。 这是我在 CodePlex 上被告知的讨论主题。因此,您无需使用此处提到的魔术字符串来生成指向 Web API 路由的链接。

原始答案

我已经设法让它工作了——尽管在 MVC 4 成为 RTMd 时它可能还没有(免责声明!)

我改变了我的 Html.RouteLink 调用如下:

@Html.RouteLink("XML request schema", "XSD", new { httproute = true })

我最初并不打算立即回答我自己的问题 - 但经过一些研究,我找到了答案。

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

在调用链之后,我记得曾经浏览过当前的 Web API 和来自 CodePlex 的页面 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";

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

显然,这可以变成扩展方法——也许Html.HttpRouteLink(和Html.HttpActionLink)——带有额外的扩展UrlHelper来隐藏路由数据值的魔术字符串。

于 2012-06-11T09:03:25.307 回答