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

时间:2013-06-14 19:52:43

标签: c# asp.net-mvc-4 attributerouting

我有一堆使用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);

1 个答案:

答案 0 :(得分:1)

使您的示例代码工作

您现有的代码示例需要进行两项更改才能正常工作:

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

    config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
    
  2. 因为HttpConfiguration路由将{controller}匹配到名为{controller} Controller的类,所以将您的网址计算更改为:

    string url = Request.Url.GetLeftPart(UriPartial.Authority) + "/api/API/GetBatches";
    
  3. 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);