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)
这种变化是唯一的,从变化的输入参数CatId
来id
....它为我的作品多次..
编辑:
很长一段时间我回头看,我想我现在知道原因了.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
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
你的控制器和操作的名称是什么?
网址应该是
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 就是为此而设计的。这不是推荐的方式。
归档时间: |
|
查看次数: |
83192 次 |
最近记录: |