1

我已经为这个问题苦苦挣扎了至少 4 个小时,尝试了我能找到的所有解决方案。

我的主要项目是使用 Asp.Net 和 MVC 设置的,它们可以很好地路由到项目中的控制器。我正在集成一个库,该库公开了一个在另一个项目中使用 ApiControllers 的 JSON api,但我无法让主项目路由到库项目中的任何内容,它只返回一个 404 海峡。

在我的主要项目 global.asax 中:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{*allaxd}", new { allaxd = @".*\.axd(/.*)?" });
        routes.IgnoreRoute("{*less}", new { less = @".*\.less(/.*)?" });

        //ignore aspx pages (web forms take care of these)
        routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
        routes.IgnoreRoute("{resource}.css/{*pathInfo}");

        //ControllerBuilder.Current.DefaultNamespaces.Add("Nexus.Controllers");

        routes.MapRoute(
            "testapi",
            "testapi/{controller}/{action}",
            new
            {
                controller = "User",
                action = "Get"
            },
            new[] { "Nexus.Controllers" }
        );

        routes.MapRoute(
            // Route name
            "Default",
            // URL with parameters
            "{controller}/{action}/{id}",
            // Parameter defaults
            new { controller = "Events", action = "Index", id = "" }
        );

    }

在我的库项目 UserController 中:

namespace Nexus.Controllers
{
    public class UserController : ApiController
    {
        public Object Get(string id)
        {
            var guid = new Guid(id);

            var user = crm.Users.Where(x => x.UserId == guid).FirstOrDefault();

            return new
            {
                id = user.UserId,
                name = user.UserName,
                email = user.Email,
                extension = user.Ext,
                phone = user.Phone
            };
        }
    }
}

我希望工作的 URL 都没有: /testapi /testapi/User /testapi/User/Get /testapi/User/Get?id=1

他们都返回 404。

我什至使用了路由调试器来验证路由是否设置正确: 路线

我错过了什么?

4

1 回答 1

4

您似乎混淆了标准 MVC 控制器(从System.Web.Mvc.Controller类派生)和 API 控制器(从System.Web.Http.ApiController类派生)。您的 UsersController 是一个 API 控制器。

因此,如果要配置 Web API 路由,则需要使用MapHttpRoute扩展方法,而不是MapRoute仅适用于标准 MVC 控制器的方法。

像这样:

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
    name: "testapi",
    routeTemplate: "testapi/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

另请注意,在 RESTful API 中,您没有在路由中指定操作名称。它是从用于使用它的 HTTP 动词中假设的。这是good article我建议您阅读有关 Web API 中的 RESTful 路由的内容。

于 2013-01-07T16:34:32.407 回答