将asp.net网站升级到asp.net web app后,Web API 2路由无法正常工作

时间:2017-09-02 01:24:38

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

我有一个使用一些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控制器?我更新了上面的代码段以反映这一点。

1 个答案:

答案 0 :(得分:0)

我明白了。创建BaseAppController的项目引用了Microsoft.AspNet.WebApi.Core的5.2.2版(以及其他库),而主Web应用程序引用了5.2.3版。一旦我在该项目中更改了对5.2.3的引用,控制器就被正确注册了。