¿Cómo crear ASP.NET Web API Url?

En ASP.NET MVC, tenemos @Url.Action para acciones. ¿Hay algo similar a @Url.Api que se dirigiría a / api / controller?

El ApiController tiene una propiedad llamada Url que es del tipo System.Web.Http.Routing.UrlHelper que le permite construir urls para los controladores de API.

Ejemplo:

 public class ValuesController : ApiController { // GET /api/values public IEnumerable Get() { // returns /api/values/123 string url = Url.Route("DefaultApi", new { controller = "values", id = "123" }); return new string[] { "value1", "value2" }; } // GET /api/values/5 public string Get(int id) { return "value"; } ... } 

Este UrlHelper no existe ni en sus puntos de vista ni en los controladores estándar.


ACTUALIZAR:

Y para poder enrutar fuera de un ApiController, puede hacer lo siguiente:

 public class HomeController : Controller { public ActionResult Index() { string url = Url.RouteUrl( "DefaultApi", new { httproute = "", controller = "values", id = "123" } ); return View(); } } 

o dentro de una vista:

  

Observe el httproute = "" token de ruta que es importante.

Obviamente, esto supone que su ruta Api se llama DefaultApi en su método RegisterRoutes en Global.asax :

 routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); 

Funciona con la forma más simple de Url.Action por lo que no tiene que hacer referencia a ningún nombre de enrutamiento:

 Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" }) 

Es posible que desee agregar un area = "" si la URL es necesaria dentro de un Área. (Los controladores Api están fuera de Areas por defecto.) Estoy usando MVC 4.

¿Desea poder generar enlaces de manera segura, sin cadenas codificadas (nombres de controlador)?

Hay un nuget para eso! (y está escrito por Mark Seeman)

https://github.com/ploeh/Hyprlinkr

Funciona así:

Rutas, como de costumbre:

 name: "API Default", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } 

Obtener una URL:

 var linker = new RouteLinker(request); var uri = linker.GetUri(r => r.GetById(1337)); 

Resultado:

 http://localhost/api/foo/1337 

Aquí está el método KISS para responder la pregunta:

Si este es el código que usaría para crear una URL de controlador MVC

 @Url.Action("Edit", "MyController") 

Para obtener una URL para la versión API del controlador (suponiendo que use el mismo nombre de controlador), puede usar

 @Url.Action("Edit", "api/MyController") 

Todo lo que está haciendo el método Url.Action es agregar la ruta raíz de la aplicación, con el nombre del controlador, seguido del nombre de la acción (a menos que sea “Índice”, en cuyo caso no se agrega) si el objeto de valores de la ruta tiene una identificación propiedad, el valor también se agrega a la URL.