Web API URL提供404错误

时间:2017-11-20 18:23:54

标签: c# api model-view-controller

我在谷歌上搜索过并发现了很多答案,我已经尝试在我自己的项目中测试以使这个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错误。有谁知道为什么?

3 个答案:

答案 0 :(得分:2)

您的网络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)操作方法处理。

答案 1 :(得分:0)

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

[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是控制器名称,第二个backup是你的方法。

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

答案 2 :(得分:0)

指定路径和控制器生成的内容。尝试在Top控制器上添加此内容

[Produces("application/json")]
[Route("api/Backup")]
public class class BackupController : ApiController

{
         //do something with other controllers



}