我有一堆使用AttributeRouting定义的自定义路由。我在控制器中有一个函数,它试图在/ api / GetBatchItems上访问这些API函数之一。
GetBatchItems是控制器APIController的一个功能,类似于:
[RouteArea("api")]
public sealed class APIController : ApiController{
[GET("GetBatches")]
public IEnumerable<PRAT.Models.EF.EFBatchItem> GetBatches() { ... }
}
在另一个控制器中,我试图得到结果。当直接浏览时,如果我这样做,一切都很好,但我希望能够使用我已经定义的路线,有没有办法做到这一点?我看到有人提到HttpAttributeRoutingConfiguration
,但我无法在任何地方找到那个班级。我不想以这种方式使用MapHttpRoute
方法...
var config = new HttpConfiguration();
config.Routes.MapHttpRoute("default", "api/{controller}/{id}", null);
var server = new HttpServer(config);
var client = new HttpClient(server);
string url = Request.Url.GetLeftPart(UriPartial.Authority) + "/api/APIController/GetBatches";
var result = client.GetAsync(url).Result;
var content = result.Content;
var model = content.ReadAsAsync<IEnumerable<PRAT.Models.EF.EFBatchItem>>().Result;
if (model == null) return View();
else return View(model);
答案 0 :(得分:1)
使您的示例代码工作
您现有的代码示例需要进行两项更改才能正常工作:
make {id}是可选的,因为GetBatches()没有参数:
config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
因为HttpConfiguration路由将{controller}匹配到名为{controller} Controller的类,所以将您的网址计算更改为:
string url = Request.Url.GetLeftPart(UriPartial.Authority) + "/api/API/GetBatches";
SIMPLER VERSION
您可以使用现有路线/ api / GetBatches
var client = new HttpClient();
string url = Request.Url.GetLeftPart(UriPartial.Authority) + "/api/GetBatches";
var result = client.GetAsync(url).Result;
var content = result.Content;
var model = content.ReadAsAsync<IEnumerable<MyViewModel>>().Result;
if (model == null) return View();
else return View(model);
即使是简单的(如果您不需要HTTP)
用此添加此扩展类替换您的示例代码:
var model = (new APIController()).GetBatches();
if (model == null) return View();
else return View(model);