网络 API 无法通过 URL
Web API is not working through URL
我有 3 个 WEB API,其中 2 个正在运行。第三个没有用,虽然它和其他的很相似。
我的控制器:
public class LNAXController : ApiController
{
[HttpGet]
public IEnumerable<State> States()
{
using (ApplicationDbContext db = new ApplicationDbContext())
{
return db.States.Where(s => s.Country.Code == "USA").OrderBy(o => o.Name).ToList();
}
}
[HttpGet]
public IEnumerable<State> States(string countryCode)
{
using (ApplicationDbContext db = new ApplicationDbContext())
{
return db.States.Where(s => s.Country.Code == countryCode).OrderBy(o => o.Name).ToList();
}
}
[HttpGet]
public IEnumerable<City> Cities(int stateId)
{
using (ApplicationDbContext db = new ApplicationDbContext())
{
return db.Cities.Where(c => c.State.Id == stateId).OrderBy(o => o.Name).ToList();
}
}
}
第一个和第二个 API、return 结果使用以下 urls 我在浏览器中键入:
http://localhost:58211/api/lnax/states
http://localhost:58211/api/lnax/states/USA
但是当我使用这个 url 时,第三个 return 出现错误:http://localhost:58211/api/lnax/cities/5
No HTTP resource was found that matches the request URI 'http://localhost:58211/api/lnax/cities/5'.
No action was found on the controller 'LNAX' that matches the request.
编辑:
这是我的配置代码:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "Get", id = RouteParameter.Optional }
);
}
}
我想您已经配置了 Web API 路由,如下所示:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{countryCode}",
defaults: new { countryCode = RouteParameter.Optional }
);
你必须让它知道你想将 countryCode
分配给 stateId
。
您可以对参数使用 [FromUri]
属性:
[HttpGet]
public IEnumerable<City> Cities([FromUri(Name ="countryCode")]int stateId)
{
using (ApplicationDbContext db = new ApplicationDbContext())
{
return db.Cities.Where(c => c.State.Id == stateId).OrderBy(o => o.Name).ToList();
}
}
考虑到你的配置,问题是参数名称。
在你的配置中你有 id
作为参数但是在你的方法中你有 stateId
,所以你需要使用参数转换
将您的方法签名更改为:
public IEnumerable<City> Cities([FromUri(Name = "id")]int stateId)
我有 3 个 WEB API,其中 2 个正在运行。第三个没有用,虽然它和其他的很相似。
我的控制器:
public class LNAXController : ApiController
{
[HttpGet]
public IEnumerable<State> States()
{
using (ApplicationDbContext db = new ApplicationDbContext())
{
return db.States.Where(s => s.Country.Code == "USA").OrderBy(o => o.Name).ToList();
}
}
[HttpGet]
public IEnumerable<State> States(string countryCode)
{
using (ApplicationDbContext db = new ApplicationDbContext())
{
return db.States.Where(s => s.Country.Code == countryCode).OrderBy(o => o.Name).ToList();
}
}
[HttpGet]
public IEnumerable<City> Cities(int stateId)
{
using (ApplicationDbContext db = new ApplicationDbContext())
{
return db.Cities.Where(c => c.State.Id == stateId).OrderBy(o => o.Name).ToList();
}
}
}
第一个和第二个 API、return 结果使用以下 urls 我在浏览器中键入:
http://localhost:58211/api/lnax/states
http://localhost:58211/api/lnax/states/USA
但是当我使用这个 url 时,第三个 return 出现错误:http://localhost:58211/api/lnax/cities/5
No HTTP resource was found that matches the request URI 'http://localhost:58211/api/lnax/cities/5'.
No action was found on the controller 'LNAX' that matches the request.
编辑:
这是我的配置代码:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "Get", id = RouteParameter.Optional }
);
}
}
我想您已经配置了 Web API 路由,如下所示:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{countryCode}",
defaults: new { countryCode = RouteParameter.Optional }
);
你必须让它知道你想将 countryCode
分配给 stateId
。
您可以对参数使用 [FromUri]
属性:
[HttpGet]
public IEnumerable<City> Cities([FromUri(Name ="countryCode")]int stateId)
{
using (ApplicationDbContext db = new ApplicationDbContext())
{
return db.Cities.Where(c => c.State.Id == stateId).OrderBy(o => o.Name).ToList();
}
}
考虑到你的配置,问题是参数名称。
在你的配置中你有 id
作为参数但是在你的方法中你有 stateId
,所以你需要使用参数转换
将您的方法签名更改为:
public IEnumerable<City> Cities([FromUri(Name = "id")]int stateId)