【问题标题】:Web API is not working through URLWeb API 无法通过 URL 工作
【发布时间】:2018-05-24 11:24:42
【问题描述】:

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

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

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

未找到与请求 URI“http://localhost:58211/api/lnax/cities/5”匹配的 HTTP 资源。

在控制器“LNAX”上找不到与请求匹配的操作。

编辑:

这是我的配置代码:

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

【问题讨论】:

  • 您是否尝试过添加明确的Route 并使用它?也许试试[Route("/api/lnax/cities/{state}/")]
  • 如果我使用 Route 属性,它会起作用,但我不想这样做并且想让它在没有属性的情况下工作
  • 这可能是因为5 被认为是string。尝试将您的方法签名更改为public IEnumerable&lt;City&gt; Cities(string stateId),然后看看它是否命中。
  • 在此处查看一些示例:stackoverflow.com/questions/11407267/…
  • 当我使用字符串类型而不是 int 时没有变化。让我看看你发的链接

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


【解决方案1】:

我想你已经配置了类似这样的 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();
    }
}

【讨论】:

  • 感谢您发布答案。请看我的编辑。我贴出配置代码。
【解决方案2】:

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

在你的配置中你有id作为参数,但在你的方法中你有stateId,所以你需要使用参数转换

将您的方法签名更改为:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2019-08-30
    • 2020-12-13
    相关资源
    最近更新 更多