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