【问题标题】:Web API URL gives 404 errorWeb API URL 给出 404 错误
【发布时间】:2017-11-20 18:23:53
【问题描述】:

我在 Google 上搜索了很多答案,我尝试在自己的项目中测试这些答案以使该 API 正常工作。但是,没有运气!

在我的全局文件中,我有:

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

在我的 WebApiConfig 文件中,我有:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}   

BackupController 包含:

public class BackupController : ApiController
{
    public IEnumerable<string> Backup()
    {
        return new string[] { "value1", "value2" };
    }

    // GET: api/Backup/5
    public string Get(int id)
    {
        return "value";
    }
}

然而,当我尝试使用 http://localhost:909/api/Backup 使用 API 时,我收到 404 错误。有谁知道为什么?

【问题讨论】:

  • 这是.netcore吗?
  • 包含正在使用的 Visual Studio 版本(如果有)、目标平台是什么(.NET Framework、.NET Core)以及其他一些详细信息可能会对您有所帮助。当你在 Visual Studio 中创建一个新项目时,它会分配一个端口(在项目中)供你的应用运行。您可能正在查询错误的位置。这些年来,我看到了一些非常奇怪的问题。

标签: c# api model-view-controller


【解决方案1】:

您的 Web api 路由定义使用不包含操作名称的路由模式。它仅使用控制器名称和可选参数。

您可能会遇到问题,因为您的操作方法名称与控制器名称相同。把它改成以Get开头的东西

public class BackupController : ApiController
{
    public IEnumerable<string> GetBackupList() // or even just Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET: api/Backup/5
    public string Get(int id)
    {
        return "value";
    }
}

现在您可以通过yourSiteName/api/backup 访问它,GetBackupList 方法将处理该请求,而yourSiteName/api/backup/34 请求将由Get(int id) 操作方法处理。

【讨论】:

  • 复制了你放的东西,但还是没有运气:(
  • 它应该与您提供的代码一起使用。您现在的操作方法名称是什么,您正在尝试的 url 是什么?
  • 您的yourSiteName/api/backup/2 工作了吗?我假设您已经在应用启动中调用了WebApiConfig.Register
  • 您的应用中是否启用了 web api?你是在应用启动内调用WebApiConfig.Register 吗?查看这篇文章以确保您启用了 web api stackoverflow.com/questions/46943556/…
  • @Shyju 美丽!我更新了我的问题以表明我没有捆绑包,您的评论是让事情正常进行的原因!谢谢!
【解决方案2】:

这并不总是必要的,但我喜欢使用路由属性来使这些东西更清晰。

[RoutePrefix("api/backup")]
public class BackupController : ApiController
{
    [Route("backup")
    public IEnumerable<string> Backup()
    {
        return new string[] { "value1", "value2" };
    }

    // GET: api/Backup/5
    [Route("get")]
    public string Get(int id)
    {
        return "value";
    }
}

如果你看一下上面这张图,你会发现你真正想要的是http://localhost:909/api/backup/backup,因为第一个backup 是Controller 名称,第二个backup 是你的方法。

在我的示例中,添加[Route("get")] 会将第二种方法变成http://localhost:909/api/backup/get?id=5 或其他任何内容,因此这不是绝对必要的——只是为了演示路由属性概念。

【讨论】:

    【解决方案3】:

    指定路由和控制器产生的内容。尝试在您的顶级控制器上添加它

    [Produces("application/json")]
    [Route("api/Backup")]
    public class class BackupController : ApiController
    
    {
             //do something with other controllers
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多