32

我已经像这样配置了我的 WebApiConfig:

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

我有一种接受一个参数的方法。访问 URI 是http://localhost:8598/api/WebApi/GetLocationCategory/87.

这给了我一个错误:No HTTP resource was found that matches the request URI 'http://localhost:8598/api/WebApi/GetLocationCategory/87'

控制器:

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

4 回答 4

23

尝试将您的控制器方法更改为

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

更改只是将输入参数从更改CatIdid.... 它对我有用很多次..

编辑


很长一段时间,当我回头看时,我想我现在知道原因了。Words Like Jared是正确的,这与我们指定的路由有关。如果我有一条路线(默认):

routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );

而我的 URL 是/MyController/GetLocationCategory/123,它将相当于/MyController/GetLocationCategory?id=123.

同样,如果我想将 Id 的参数名称更改为 CatId,那么我需要更改查询字符串参数(我调用 Controller Action 的方式会改变)。现在将是:

/MyController/GetLocationCategory?CatId=123

于 2013-03-30T09:21:49.027 回答
7
config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

映射到:

http://localhost:8598/api/Controller/Action/id

url的WebApi部分与api. 然后修改方法参数名称以匹配路由:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)

这是一个很好的默认值,因为它符合约定。

或者,您可以修改路由以改用这个非常规的参数名称:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{CatID}",
            defaults: new { CatID = RouteParameter.Optional }
        );

最后,无论哪种情况,请确保控制器名称以Controller.

好名字:CustomControllerCustomApiController
坏名字:CustomCustomApi

于 2014-04-14T20:13:18.923 回答
3

您的控制器和操作的名称是什么?

网址应该是

http://localhost:8598/api/Controller/Action

它没有映射到您指定的路由配置,因此管道无法找到正确的控制器。/id 不应该在它必须在正文或查询参数中的路径中(我被仓促难住了!!)

例子 : -

public class FooController : ApiController
    {
        public int GetIndex(int id)
        {
            return id;
        }
    }

localhost:58432/api/foo/GetIndex?Id=1

O/P :- 1

注意:- 如果您的操作名称是GetIndex,则 URLGetIndex不能只是索引。或者,您可以指定[HttpGet]操作的属性。

如果您的 WebApi.config 中也有以下内容

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

那么http://localhost:58432/api/foo?Id=1也将是一条合法的路线。不确定你是否想要那个。

此外,使用 WebAPI 尽可能坚持非基于操作的路由,MVC 就是为此而生的。这不是推荐的方式。

于 2013-03-30T06:37:15.173 回答
2

您的请求网址是http://localhost:8598/api/WebApi/GetLocationCategory/87

您的路线配置为接受:'api/{controller}/{action}/{id}'

所以你需要确保你的控制器的名字是'WebApiController'。

此外,正如@SDG 所说,您需要确保您的操作方法的参数名称与您在路线模板中的名称相匹配,即将“CatID”更改为“id”

于 2013-05-22T14:04:59.830 回答