将web api添加到mvc应用程序 - 路由

时间:2015-01-06 22:36:21

标签: c# asp.net-mvc

我有一个带有此路由的mvc应用程序:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Default", action = "Index", id = UrlParameter.Optional }
    );


}

我可以通过以下方式访问我的控制器:

http://localhost:1234/Test/Version

现在,我想在这个mvc应用程序中添加一个web api。 我们说它叫做TestWebAPIController 但是,我无法访问

http://localhost:1234/TestWebAPI

http://localhost:1234/TestWebAPI/Get

我该如何解决这个问题? 我已经尝试将路线更改为

  

url:“{controller} / {id}”,...

更新 我尝试添加一个WebApiConfig.cs

public static class WebApiConfig
{
    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 }
        );
    }
}

并尝试添加

GlobalConfiguration.Configure(WebApiConfig.Register);

到Global.asax.cs 但我得到语法错误...... 在WebConfig.cs中,它抱怨:

config.MapHttpAttributeRoutes();

并且表示不包含MapHttpAttributeRoutes的定义 在Global.asax.cs中,它抱怨

GlobalConfiguration.Configure(WebApiConfig.Register);

并说System.Web.Http.GlobalConfiguration不包含'Configure'的定义

更新 安装webapi之后:

  

安装包Microsoft.AspNet.WebApi.WebHost

错误消失但我仍然无法路由到我的webapi。

更新 终于搞定了。 在global.asap.cs中,您必须将webapi路由 BEFORE 放在mvc路由中,如下所示:

    GlobalConfiguration.Configure(WebApiConfig.Register);
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);

还需要改变:

routeTemplate: "api/{controller}/{id}"

routeTemplate: "api/{controller}/{action}/{id}"

2 个答案:

答案 0 :(得分:2)

Web API不使用与MVC相同的路由。如果您在Visual Studio for Web API中启动一个新项目,或者包含Web API,您将在App_Start文件夹下看到一个名为WebApiConfig.cs的文件。这是您的Web API路由的去向。这些路由通过此类的Register()方法注册,使用传入的HttpConfiguration对象:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //other stuff

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/v1/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
            );

        //other stuff
    }
}

请注意,我在路径前面加上了“api / v1 /”。这或类似的东西通常是一种很好的做法,因此您可以根据需要对api进行版本设置,而不会影响使用旧版API的代码。

答案 1 :(得分:1)

Web Api路由已注册到HttpConfiguration。 Web Api不与项目的MVC部分共享相同的路径集合。

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 }
    );
}

如果您致电http://localhost:1234/TestWebAPI,那么您将无法正确路由。如果您使用此问题中显示的路线模板,则应致电http://localhost:1234/api/TestWebAPI