2013-06-14 1 views
2

나는 AttributeRouting을 사용하여 정의 된 커스텀 라우트들을 가지고있다./api/GetBatchItems에서 API 함수 중 하나에 액세스하려고하는 컨트롤러에 함수가 있습니다. 다른 컨트롤러에서 attributerouting을 사용하여 커스텀 라우트를 소비하는 방법은 무엇입니까?

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

, 나는 결과를 얻기 위해 노력하고 있어요 :

GetBatchItems 유사한 컨트롤러 APIController의 함수이다. 이런 식으로하면 모든 항목을 직접 찾아 볼 수 있지만 이미 정의 된 경로를 사용할 수 있기를 원한다면 그렇게 할 수있는 방법이 있습니까? 나는 누군가가 HttpAttributeRoutingConfiguration라고 언급하는 것을 보았지만 그 수업을 어디에서나 찾을 수는 없었다. 나는

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

당신이 다른 컨트롤러에서 "당신의 문을 설명하는 샘플 코드를 제공시겠습니까를, 내가 노력하고 있어요 결과를 얻으려면? " –

+0

두 번째 코드 샘플은 다른 컨트롤러의 샘플입니다. 나에게 데이터를 가져 오기 위해 HttpClient를 만들고있다. – appsecguy

+0

1. 직접 검색하는 URL은 무엇입니까? http : // /api/GetBatches? 2. 두 컨트롤러가 모두 같은 사이트에 있다면 왜 http를 통해 다른 컨트롤러와 대화를해야합니까? 왜 두 번째 컨트롤러가 첫 번째 컨트롤러의 GetBathces() 메서드를 참조하도록하지 않습니까? –

답변

1

기존 코드 예제가 작동하려면 두 가지 변화를 필요로 샘플 코드를 작동하게 할 ... MapHttpRoute 방법이 방법을 사용하고 싶지 않습니다

    config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id = RouteParameter.Optional }); 
    
    :
  1. 메이크업 GetBatches 이후 {ID} 옵션은()에는 매개 변수가 없습니다

  2. 가 {컨트롤러} 컨트롤러라는 이름의 클래스에 HttpConfiguration 경로가 일치 {컨트롤러} 이후에 URL 계산을 변경

    string url = Request.Url.GetLeftPart(UriPartial.Authority) + "/api/API/GetBatches"; 
    

간단 버전

귀하의 기존 경로를 사용할 수 있습니다/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); 

EVEN SIM PLER (당신이 HTTP가 필요하지 않은 경우)

이와 샘플 코드를 바꿉니다이 확장 클래스 추가 :

var model = (new APIController()).GetBatches(); 
if (model == null) return View(); 
else return View(model); 
관련 문제