asp.net-mvc - tutorial - ruteo mvc
No se encontró ningún recurso HTTP que coincida con el URI de solicitud en la API web (4)
He configurado mi WebApiConfig así:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Tengo un método que acepta un parámetro. El URI de acceso es http://localhost:8598/api/WebApi/GetLocationCategory/87
.
Esto me da un error: No HTTP resource was found that matches the request URI ''http://localhost:8598/api/WebApi/GetLocationCategory/87''
Controlador:
public IEnumerable<LocationCategory_CLS> GetLocationCategory(int CatID)
{
var LocCats = (from lct in entities.tdp_LocationCategories join lc in entities.tdp_LocationMaster on lct.FK_LocationID equals lc.LocationID where lct.IsApproved == 0 && lct.FK_CategoryID == CatID select new { lc.LocationID, lc.LocationName }).ToList();
List<LocationCategory_CLS> loc = new List<LocationCategory_CLS>();
foreach (var element in LocCats)
{
loc.Add(new LocationCategory_CLS
{
LocationID = element.LocationID,
LocationName = element.LocationName
});
}
return loc;
}
¿Cuál es el nombre de tu controlador y acción?
La URL debe ser
http://localhost:8598/api/Controller/Action
No se asigna a la configuración de ruta que ha especificado, por lo tanto, la tubería no puede ubicar el controlador correcto. El / id no debe estar en la ruta que debe estar en el cuerpo o en los parámetros de consulta (¡me quedé de piedra a toda prisa!)
Ejemplo: -
public class FooController : ApiController
{
public int GetIndex(int id)
{
return id;
}
}
localhost:58432/api/foo/GetIndex?Id=1
O/P :- 1
Nota: - Si su nombre de acción es GetIndex
, la URL debe ser GetIndex
no solo Index. Opcionalmente, puede especificar el atributo [HttpGet]
para la acción.
Si tiene lo siguiente también en su WebApi.config
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Entonces http://localhost:58432/api/foo?Id=1
también sería una ruta legítima. No estoy seguro si quieres eso.
Además, con WebAPI, en la medida de lo posible, se adhiere al enrutamiento no basado en acción, MVC está destinado para eso. No es la forma recomendada.
Intenta cambiar tu método de Controlador como
public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id) <-- Change
{
var LocCats = (from lct in entities.tdp_LocationCategories join lc in entities.tdp_LocationMaster on lct.FK_LocationID equals lc.LocationID where lct.IsApproved == 0 && lct.FK_CategoryID == id select new { lc.LocationID, lc.LocationName }).ToList();
List<LocationCategory_CLS> loc = new List<LocationCategory_CLS>();
foreach (var element in LocCats)
{
loc.Add(new LocationCategory_CLS
{
LocationID = element.LocationID,
LocationName = element.LocationName
});
}
return loc;
}
El cambio es único, cambiando el parámetro de entrada de CatId
a id
... Funciona para mí muchas veces ...
Editar :
Es mucho tiempo cuando miro hacia atrás , creo que ahora sé el motivo. Words Like Jared
es correcto, todo tiene que ver con enrutamiento que especificamos. Si tengo una ruta (predeterminada) como:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
Y mi URL es /MyController/GetLocationCategory/123
, será equivalente a /MyController/GetLocationCategory?id=123
.
De manera similar, si quiero cambiar el nombre de mi parámetro para que Id diga CatId, entonces necesito cambiar el parámetro de la cadena de consulta (la forma en que llamo mi Acción de controlador cambiaría). Que ahora sería:
/MyController/GetLocationCategory?CatId=123
Su URL de solicitud es http://localhost:8598/api/WebApi/GetLocationCategory/87
Su ruta está configurada para aceptar: ''api / {controller} / {action} / {id}''
Por lo tanto, debe asegurarse de que el nombre de su controlador sea ''WebApiController''.
Además, como se indicó anteriormente por @SDG, debe asegurarse de que el nombre del parámetro para su método de acción coincida con el que tiene en su plantilla de ruta, es decir, cambie ''CatID'' por ''id''.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Mapas a:
http://localhost:8598/api/Controller/Action/id
La porción de WebApi
de la url es redundante con api
. Luego, modifique el nombre del parámetro del método para que coincida con la ruta:
public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)
Este es un buen valor predeterminado ya que coincide con la convención.
Alternativamente, puede modificar la ruta para usar este nombre de parámetro no convencional en su lugar:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{CatID}",
defaults: new { CatID = RouteParameter.Optional }
);
Finalmente, en cualquier caso, asegúrese de que el nombre del controlador termine en Controller
.
Buenos nombres: CustomController
, CustomApiController
Nombres incorrectos: Custom
, CustomApi