2017-03-14 81 views
1

我是新来的API设计与VS2017,我试图使我的简单的API工作与数据库中的几个SQL对象。Noob in ASP MVC Routing - 404错误

我有一个非常简单的项目,它看起来像这样:

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资源。

同样的事情,当我试图访问一个特定的ID与/ api/users/1 任何人都可以指出我应该尝试和改变的地方? 我迷失在配置文件和路线的丛林中!

谢谢!

编辑: 经过一些很好的答案,这里有一些更多的信息: 我想知道如果问题不在别的地方。当我在localhost/api上时,我得到一个“漂亮”的错误页面,但是当我尝试访问/ api/users/index时,我得到一个带有404消息的XML响应。这是另一个问题的标志吗? 需要注意的是,Swagger UI完全没有任何显示。 。

回答

1

使用http://localhost:yourport/users/index“,而不是

的URL格式始终Controller/Action/Parameters

+0

谢谢,当我更新时,当我尝试访问“良好”路线时,错误页面不一样。但我的问题尚未解决。 –

1

添加一个新的路由与{行动}

config.Routes.MapHttpRoute(
    name: "MyNewRoute", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { type = RouteParameter.Optional } 

网址:http://localhost:myport/api/users/details/123456

2

你的路由配置提及模板中只有一个Controller没有默认Action associ与...一起。

多项选择提供给你,但是,我建议去一个简单的,如:

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。指数
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

+0

在action =“index”和id = RouteParameter.Optional之间加上一个逗号 – Kixoka

+0

谢谢,一开始没有看到它。 – StfBln

+0

嗨,谢谢你的兴趣,你的答案似乎并没有解决我的问题。 我想知道这个问题是不是在别的地方。 当我在localhost/api上时,出现一个“漂亮”的错误页面,但是当我尝试访问/ api/users/index时,我得到一个带有404消息的XML响应。 这是另一个问题的标志吗? 再次感谢。 –