4

我有一个项目(名为Product.Api),其中包含一些用于我们的 WebAPI 站点的控制器。控制器位于命名空间中Product.Api.Controllers。该项目还有一些其他的辅助工具。这被编译成一个库。

我还有另一个名为Product.Web. 这有控制器(在命名空间下Product.Web.Controllers)、模型和视图(在其相应的文件夹中)。它还有一个Global.asax.cs包含路由信息的。

在 IIS(.NET 4.5、IIS7、集成模式等)中创建站点时,我将Product.Apidll 复制到 bin 文件夹中。是Product.Web主要站点。

现在我希望 url http://www.product.com/api/ {Controller}/{id} 映射到 WebAPI 的东西和http://www.product.com/ {Controller}/{Action}/{ id} 映射到常规 MVC。

这就是我现在拥有的路线:

routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}", 
                defaults: new {id = RouteParameter.Optional}
            ).Constraints["Namespaces"] = new string[] { "Product.Api.Controllers" };

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ,
                namespaces: new[] { "Product.Web.Controllers" }
            );

不幸的是,当我访问 api url 时(在本例中,示例是http://www.product.com/api/Tables/(或者即使我定义了一个 id),我得到一个 HTTP 404 错误。

http://www.product.com/Home/Index工作正常。

奇怪的是,我尝试了路由调试器工具,但仍然有问题。事实上,我永远看不到调试器的输出。http://www.product.com/Home/Indexhttp://www.product.com/都显示了视图,但所有 api/* 仍然显示 404。我还没有看到调试器的任何输出。

那么到底有没有达到想要的效果呢?

编辑:我注意到我的 global.asax.cs 文件在Product.Web命名空间中。我将其更改为在Product名称空间中,但仍然不行。

4

2 回答 2

4
routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}", 
                defaults: new {id = RouteParameter.Optional}
            ).Constraints["Namespaces"] = new string[] { "Product.Api.Controllers" };

这不适用于 MapHttpRoute。

如果你想使用另一个 bin 中的 ApiController 路由,只需删除约束,运行时会自动从 bin 中获取你的 ApiControllers。MapHttpRoute 不会干扰您的 MVC 控制器,反之亦然,因此无论如何都不需要约束。

或者使用它来限制您的 HttpRoute 命名空间

routes.DataTokens["Namespaces"] = new string[] {"MyNamespace"};

或者使用这个解决方案(但只有当你把东西放在垃圾箱外面时才需要这样做。)

于 2012-07-25T07:18:55.743 回答
-1

在 MapHttpRoute Factory 调用之前添加 System.Web.Mvc.ControllerBuilder.Current.DefaultNamespaces.Add("Namespace.Full.Controllers");

于 2013-03-26T21:35:44.043 回答