C# 如何使用attributerouting使用自定义路由?

C# 如何使用attributerouting使用自定义路由?,c#,asp.net-mvc-4,attributerouting,C#,Asp.net Mvc 4,Attributerouting,我有一系列使用AttributeRouting定义的自定义路由。我在控制器中有一个函数,它试图访问/API/GetBatchItems上的其中一个API函数 GetBatchItems是控制器ApicController的一个功能,类似于: [RouteArea("api")] public sealed class APIController : ApiController{ [GET("GetBatches")] public IEnumerable<PRAT.Mode

我有一系列使用AttributeRouting定义的自定义路由。我在控制器中有一个函数,它试图访问/API/GetBatchItems上的其中一个API函数

GetBatchItems是控制器ApicController的一个功能,类似于:

[RouteArea("api")]
public sealed class APIController : ApiController{
    [GET("GetBatches")]
    public IEnumerable<PRAT.Models.EF.EFBatchItem> GetBatches() { ... }
}

使示例代码正常工作

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

  • 将{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";
    
  • 更简单的版本

    您可以使用现有的route/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);
    

    请提供示例代码以说明您的陈述“在另一个控制器中,我正在尝试获得结果”?第二个代码示例来自另一个控制器。我正在创建一个HttpClient来获取数据。1。什么是可以直接浏览的url?http:///api/GetBatches? 2.如果两个控制器都在同一个站点上,为什么一个控制器通过http与另一个控制器通信?为什么不让第二个控制器引用第一个控制器的GetBathces()方法呢?直接浏览时,它是/api/GetBatches。我确信问题可能是我正在执行config.routes.maphttproute,但我不知道如何将attributerouting自定义路由添加到httpconfiguration。
    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);
    
    var model = (new APIController()).GetBatches();
    if (model == null) return View();
    else return View(model);