J'ai configuré mon WebApiConfig comme ceci:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
J'ai une méthode qui accepte un paramètre. L'URI d'accès est http://localhost:8598/api/WebApi/GetLocationCategory/87
.
Cela me donne une erreur: No HTTP resource was found that matches the request URI 'http://localhost:8598/api/WebApi/GetLocationCategory/87'
Manette:
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;
}
Essayez de changer votre méthode de contrôleur comme
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;
}
Le changement est seulement, changer le paramètre d'entrée de CatId
à id
.... Cela fonctionne pour moi plusieurs fois ..
Modifier:
C'est long quand je regarde en arrière Je pense Je connais la raison maintenant. Words Like Jared
est correct, tout est lié au routage que nous spécifions. Si j'ai un itinéraire (par défaut) comme:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
Et mon URL est /MyController/GetLocationCategory/123
, ce sera équivalent à /MyController/GetLocationCategory?id=123
.
De même, si je veux changer le nom de mon paramètre pour que Id dise CatId, alors je dois changer le paramètre de chaîne de requête (la façon dont j'appelle mon action de contrôleur changerait). Ce qui serait désormais:
/MyController/GetLocationCategory?CatId=123
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Correspond à:
http://localhost:8598/api/Controller/Action/id
La partie WebApi
de l'url est redondante avec api
. Modifiez ensuite le nom du paramètre de méthode pour qu'il corresponde à l'itinéraire:
public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)
C'est une bonne valeur par défaut car elle correspond à la convention.
Alternativement, vous pouvez modifier l'itinéraire pour utiliser ce nom de paramètre non conventionnel à la place:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{CatID}",
defaults: new { CatID = RouteParameter.Optional }
);
Enfin, dans les deux cas, assurez-vous que le nom du contrôleur se termine par Controller
.
Bons noms: CustomController
, CustomApiController
Mauvais noms: Custom
, CustomApi
quel est le nom de votre contrôleur et de votre action?
L'URL doit être
http://localhost:8598/api/Controller/Action
Il ne correspond pas à la configuration d'itinéraire que vous avez spécifiée, par conséquent le pipeline n'est pas en mesure de localiser le contrôleur correct. Le/id ne doit pas être dans le chemin d'accès, il doit être dans le corps ou les paramètres de requête (je me suis retrouvé perplexe !!)
Exemple : -
public class FooController : ApiController
{
public int GetIndex(int id)
{
return id;
}
}
localhost:58432/api/foo/GetIndex?Id=1
O/P :- 1
Remarque: - Si le nom de votre action est GetIndex
, l'URL doit être GetIndex
et pas seulement Index. Vous pouvez éventuellement spécifier le [HttpGet]
attribut pour l'action.
Si vous avez également les éléments suivants dans votre WebApi.config
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Ensuite http://localhost:58432/api/foo?Id=1
serait également une voie légitime. Je ne sais pas si vous le voudriez.
En outre, avec WebAPI, dans la mesure du possible, respectez le routage sans action, MVC est fait pour cela. Ce n'est pas la voie recommandée.
L'URL de votre demande est http://localhost:8598/api/WebApi/GetLocationCategory/87
Votre itinéraire est configuré pour accepter: 'api/{controller}/{action}/{id}'
Vous devez donc vous assurer que le nom de votre contrôleur est "WebApiController".
En outre, comme indiqué précédemment par @SDG, vous devez vous assurer que le nom du paramètre de votre méthode d'action correspond à ce que vous avez dans votre modèle de route, c'est-à-dire changer 'CatID' en 'id'