如何使用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);

如何使用attributerouting来消费自定义路由?

让你的示例代码工作

您现有的代码示例需要两个更改才能工作:

  1. 使{id}可选,因为GetBatches()没有参数:

    config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
    
  2. 因为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);