2013-07-19 12 views
9

im mit asp.net mvc4 arbeiten, und ich habe in ‚controller1‘ diese Aktion:generieren absolute URL Aktion aus Api Controller

[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; 
     } 
    } 

wenn ich uri die Aktion funktioniert gut, zu "http://localhost:1733/controller2/action2" gesetzt, aber nie mit uri auf "controller2/action2" oder "/ controller2/action2" oder "~/controller2/action2" eingestellt.

Wie kann ich diese Aktion ohne Hardcoding der URI schreiben?

Vielen Dank.

Antwort

14

Verwendung:

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

Update:

Da Sie eine API-Controller verwenden und benötigen eine URL zu einem normalen Controller zu generieren, sind Sie gonna zu verwenden:

Wo Default ist der Name der route in Ihrer registrierten Routen Sammlung definiert, oder wenn Sie bereits eine spezifische Route für diese Aktion erstellt, verwenden Sie den Namen und new{} als 2. Parameter.

Überprüfen Sie für MVC Version 4 Ihre registrierten Routen unter ~/App_Start/RoutesConfig.cs. für MVC Version 3, überprüfen Sie Ihre RegisterRoutes Methode in Ihrem Global.asax. Ein weiterer

+2

'System.Web.Http.Routing.UrlHelper' enthält keine Definition für 'Aktion' und keine Erweiterungsmethode 'Aktion', die ein erstes Argument vom Typ 'System.Web.Http.Routing.UrlHelper' akzeptiert, wurde gefunden (fehlt Ihnen eine using-Direktive oder eine Assembly-Referenz?) – dafriskymonkey

+0

fehlt eine Referenz? – dafriskymonkey

+1

Die Aktion, für die Sie absolute URL generieren möchten, ist die WebApi-Methode oder eine reguläre Controller-Aktion? – haim770

12

, vielleicht einfachere Antwort ist eine Instanz von UrlHelper in Ihrer WebAPI Klasse zu erstellen:

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

Pass in dem aktuellen Anforderungskontext und Sie sind Gold.