Web API无法通过URL工作

时间:2017-12-10 23:08:57

标签: c# asp.net-web-api2

我有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,使用我在浏览器中输入的以下网址返回结果:

http://localhost:58211/api/lnax/states
http://localhost:58211/api/lnax/states/USA

但是当我使用这个网址时,第3个会返回错误:http://localhost:58211/api/lnax/cities/5

  

找不到与请求URI匹配的HTTP资源&#39; http://localhost:58211/api/lnax/cities/5&#39;。

     

控制器上未找到任何操作&#39; LNAX&#39;与请求匹配。

编辑:

这是我的配置代码:

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

2 个答案:

答案 0 :(得分:0)

我认为您已经配置了类似的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();
    }
}

答案 1 :(得分:0)

考虑到您的配置,问题是参数的名称。

在您的配置中,您有id作为参数,但在您的方法中,您有stateId,因此您需要使用参数转换

将您的方法签名更改为:

public IEnumerable<City> Cities([FromUri(Name = "id")]int stateId)