我是VS2017的API设计新手,我试图让我的简单API在数据库中使用少量SQL对象。
我有一个相当简单的项目,如下所示:
WebApiConfig.cs:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
//config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
我认为这是股票,所以应该把我带到我想要的地方。 我有一些基于相同原理的控制器,例如:
public class UsersController : Controller
{
private APIContext db = new APIContext();
// GET: Users
public ActionResult Index()
{
return View(db.Users.ToList());
}
// GET: Users/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Users users = db.Users.Find(id);
if (users == null)
{
return HttpNotFound();
}
return View(users);
}
}
它们中有更多,但所有内容都已自动生成,因此我认为不必显示它们。
问题是当我到localhost / api / users时,我得到404错误页面: 未找到与请求URI“http://localhost:myport/api/users”匹配的HTTP资源。
当我尝试使用/ api / users / 1访问特定ID时也是如此 任何人都可以指出我应该尝试改变的地方吗? 我迷失在配置文件和路线的丛林中!
谢谢!
编辑: 在得到一些好的答案后,这里有更多信息: 我想知道问题是否不在其他地方。当我在localhost / api上时,我得到一个“漂亮”的错误页面,但当我尝试访问/ api / users / index时,我得到一个带有404消息的XML响应。这是另一个问题的迹象吗? 值得注意的是,Swagger UI完全没有显示任何内容。
答案 0 :(得分:2)
您的路由配置仅提及模板中的Controller
,但没有与之关联的默认Action
。
您可以选择多种选择,但我建议您选择一个简单的选项,如:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
//config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "index", id = RouteParameter.Optional }
);
}
现在Action
是模板的一部分,默认值为index
,您将拥有以下内容:
http://localhost:myport/api/users 重定向到 UsersController.Index
http://localhost:myport/api/users/index 重定向到 UsersController.Index
http://localhost:myport/api/users/details 重定向到 UsersController.Details
http://localhost:myport/api/users/details/123 重定向到 UsersController.Details
编辑经过第二次调查后,您似乎正在使用MVC控制器而不是WebApi控制器。虽然它们都具有相同的名称,但它们属于不同的名称空间,需要自己的配置。
要配置MVC控制器路由,请确保在App_Start
文件夹中包含以下类:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional }
);
}
}
然后,从Global.asax
,在Application_Start
方法中,确保进行以下调用:
RouteConfig.RegisterRoutes(RouteTable.Routes);
如:
protected void Application_Start()
{
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
从现在开始,您可以通过 http://localhost:myport/users 访问您的控制器。
另一方面,如果你想要一个返回数据而不是视图的API,你需要你的控制器继承ApiController
。
答案 1 :(得分:1)
使用http://localhost:yourport/users/index"代替。
网址格式始终为Controller/Action/Parameters
。
答案 2 :(得分:1)
使用{action}
添加新路线config.Routes.MapHttpRoute(
name: "MyNewRoute",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { type = RouteParameter.Optional }