未找到与Web API中的请求URI匹配的HTTP资源

Dha*_*tel 32 asp.net-mvc asp.net-web-api

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

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

我有一个接受一个参数的方法.访问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;
}
Run Code Online (Sandbox Code Playgroud)

Shu*_*ubh 23

尝试将Controller方法更改为

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;
}
Run Code Online (Sandbox Code Playgroud)

这种变化是唯一的,从变化的输入参数CatIdid....它为我的作品多次..

编辑:


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

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

我的URL是/MyController/GetLocationCategory/123,它将等同于/MyController/GetLocationCategory?id=123.

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

/MyController/GetLocationCategory?CatId=123


P.B*_*key 7

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

地图到:

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

WebApi网址的部分是多余的api.然后修改方法参数名称以匹配路由:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)

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

或者,您可以修改路径以使用此非常规参数名称:

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

最后,在任何一种情况下都要确保控制器名称结束Controller.

好名字:CustomController,CustomApiController
坏的名字:Custom,CustomApi


ash*_*ina 3

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

网址应该是

http://localhost:8598/api/Controller/Action
Run Code Online (Sandbox Code Playgroud)

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

例子 : -

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

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

O/P :- 1
Run Code Online (Sandbox Code Playgroud)

注意:- 如果您的操作名称是,GetIndex则 URL 不能GetIndex只是 Index。您可以选择指定[HttpGet]操作的属性。

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

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

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

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