网络 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)