ASP MVC路由中的Noob - 404错误

时间:2017-03-14 14:08:47

标签: c# asp.net asp.net-mvc asp.net-web-api

我是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完全没有显示任何内容。

3 个答案:

答案 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 }

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