2013-07-19 14 views
9

im pracy z ASP.NET mvc4 i mam na „controller1” tego działania:Generowanie bezwzględny adres URL do działania od wewnątrz kontrolera Api

[HttpGet] 
    public async Task<string> Action1() 
    { 
     try 
     { 
      HttpClient cl = new HttpClient(); 
      string uri = "controller2/action2"; 
      HttpResponseMessage response = await cl.GetAsync(uri); 
      response.EnsureSuccessStatusCode(); 
      return response.ToString(); 
     } 
     catch 
     { 
      return null; 
     } 
    } 

kiedy ustawić URI do "http://localhost:1733/controller2/action2" akcja działa poprawnie, ale nigdy z uri ustawione na "controller2/action2" lub "/ controller2/action2" lub "~/controller2/action2".

Jak mogę napisać tę akcję bez zakodowania uri?

Dziękuję.

Odpowiedz

14

Zastosowanie:

string uri = Url.Action("Action2", "Controller2", new {}, Request.Url.Scheme); 

Aktualizacja:

Ponieważ używasz kontrolera API i trzeba wygenerować URL do regularnego kontroler, będziesz musiał użyć:

string uri = this.Url.Link("Default", new { controller = "Controller2", action = "Action2" }); 

Gdzie Default to nazwa route zdefiniowana w zarejestrowanym zbiorze tras lub jeśli utworzyłem już specjalną trasę dla tej akcji, użyj jej nazwy i new{} jako drugiego parametru.

Dla wersji MVC 4 sprawdź zarejestrowane trasy pod numerem ~/App_Start/RoutesConfig.cs. dla wersji MVC 3, sprawdź swoją metodę RegisterRoutes w swoim Global.asax.

+2

"System.Web.Http.Routing.UrlHelper" nie zawiera definicji "Akcja" i nie ma metody rozszerzenia "Akcja" akceptująca pierwszy argument typu "System.Web.Http.Routing.UrlHelper" został znaleziony (czy brakuje dyrektywy użycia lub odniesienia do zestawu?) – dafriskymonkey

+0

im brakuje jakiegoś odniesienia? – dafriskymonkey

+1

Akcja, którą chcesz wygenerować bezwzględny adres URL, czy jest to metoda WebApi czy zwykła czynność kontrolera? – haim770

12

Innym, być może prostsza odpowiedź, jest stworzenie instancji UrlHelper w klasie WebAPI:

var url = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext); 
item.Url = url.Action("Doc", "Editor", new {id=1}); 

przechodzą w obecnym kontekście żądanie i jesteś złoto.

Powiązane problemy