我在同一个项目中运行 WebApi 和 Mvc(所以它们是在进程中的)。Mvc 主要用于服务资产(页面和生成的下载)和用于 ajax 数据请求的 web api。
为了成为 RESTish,大多数 WebApi 请求都包含一组链接,这些链接由以下类生成:
public class ApiLinkMaker
{
public ApiLinkMaker(UrlHelper url, string authority) {
this.url = url;
this.authority = authority;
}
public ApiLinkMaker(ApiController controller)
: this(controller.Url, controller.Request.RequestUri.Authority) { }
public string MakeLink(string controller, string id) {
return "//" + authority + url.Route("DefaultApi", new { controller = controller, id = id });
}
}
那里还有其他一些方法,但这确实是事情的核心,而且效果很好。
现在我想优化一个特定的页面。以前我有两个请求
- 下载html
- 执行 Ajax 查询以获取一些数据(和一些链接)
现在我意识到,为了优化目的,在这种情况下最好只做一个。
- 下载已嵌入 JSON 数据的 html。
问题是,由于 html 是由 Mvc 生成的,我无法创建一个似乎可以工作的 Api UrlHelper。
我试过了
var url = new UrlHelper(new HttpRequestMessage(verb, controller.Request.Url.AbsoluteUri));
if (!url.Request.Properties.ContainsKey(HttpPropertyKeys.HttpConfigurationKey)) //http://stackoverflow.com/questions/11053598/how-to-mock-the-createresponset-extension-method-on-httprequestmessage
url.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());
但这仍然爆炸
System.ArgumentException was unhandled by user code
HResult=-2147024809
Message=A route named 'DefaultApi' could not be found in the route collection.
Parameter name: name
Source=System.Web.Http
ParamName=name
StackTrace:
at System.Web.Http.HttpRouteCollection.GetVirtualPath(HttpRequestMessage request, String name, IDictionary`2 values)
at System.Web.Http.Routing.UrlHelper.GetHttpRouteHelper(HttpRequestMessage request, String routeName, IDictionary`2 routeValues)
at System.Web.Http.Routing.UrlHelper.GetHttpRouteHelper(HttpRequestMessage request, String routeName, Object routeValues)
at System.Web.Http.Routing.UrlHelper.Route(String routeName, Object routeValues)
at MyProject.Models.ApiLinkMaker.MakeLink(String controller, String id) in w:\MyProject\Models\ApiLinkMaker.cs:line 42
...
这让我认为我做错了——我需要以某种方式从 api 路由配置创建 url 帮助程序。