我有一个使用一些Web Api 2控制器的asp.net网站类型项目。我将它转换为支持所有三种技术的asp.net Web应用程序:webforms,web api和mvc。
web api控制器已被转换器(通过Project - >转换为Web应用程序)移动到名为Old_App_Code的文件夹。它们位于App_Code / WebApi文件夹中,现在它们位于Old_App_Code / WebApi中。除了一个控制器之外的所有控制器都在命名空间中,我们称之为name1.name2.name3:
namespace name1.name2.name3
{
[RoutePrefix("api/v1/orders")]
public class OrdersController : BaseAppController //BaseAppController is a class that inherits ApiController and adds a few common methods to all WebApi controllers ...
{
...
}
}
WebApiConfig.cs(在Old_App_Code下):
namespace name1.name2.name3
{
/// <summary>
/// </summary>
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();//use attributes to map routes.
}
}
}
的global.asax.cs:
protected void Application_Start()
{
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
// Code that runs on application startup
log4net.Config.XmlConfigurator.Configure();
AreaRegistration.RegisterAllAreas();
// GlobalConfiguration.Configure(WebApiConfig.Register);
GlobalConfiguration.Configure(name1.name2.name3.WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
RouteConfig.cs:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
我遇到的问题是网络api路由不再起作用了,我得到404.
我使用了ApiHelp页面,注册的唯一控制器是没有开始使用命名空间的控制器。我把它放在一个命名空间中,希望它不会出现(为了得到一些一致性:-)),但它仍然显示出来(我重新启动了IIS Express)。
不知何故,MapHttpAttributeRoutes似乎没有找到这些控制器来构建web api路由。
有什么想法吗?
我正在使用VS 2015与System.Web.Mvc版本5.2.3.0和Microsoft.AspNet.WebApi 5.2.3。
更新:工作的控制器直接从ApiController继承,而其他控制器继承自不同项目中的公共类(继承ApiController),并在另一个应用程序中使用。有没有办法告诉组件注册控制器这些是WebApi控制器?我更新了上面的代码段以反映这一点。
答案 0 :(得分:0)
我明白了。创建BaseAppController的项目引用了Microsoft.AspNet.WebApi.Core的5.2.2版(以及其他库),而主Web应用程序引用了5.2.3版。一旦我在该项目中更改了对5.2.3的引用,控制器就被正确注册了。