如何使用attributerouting来消费自定义路由?
本文关键字:自定义 路由 何使用 attributerouting | 更新日期: 2023-09-27 18:18:33
我使用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);
让你的示例代码工作
您现有的代码示例需要两个更改才能工作:
使{id}可选,因为GetBatches()没有参数:
config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
因为HttpConfiguration路由匹配{controller}到一个名为{controller} controller的类,所以把你的url计算改为:
string url = Request.Url.GetLeftPart(UriPartial.Authority) + "/api/API/GetBatches";
简单版本/strong>
你可以使用你现有的路由/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);