ApiController和Controller在单个项目中路由冲突

时间:2014-04-02 08:47:22

标签: asp.net-mvc controller routes asp.net-apicontroller

我有2个控制器(以及ApiController和Controller)。我的ApiController在Controller返回视图时调用提供程序从数据库中获取数据。我为他们创建了单独的路由配置。但是,似乎在确定使用哪条路线方面存在问题?我不太确定

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 { id = UrlParameter.Optional }
        );
    }
}

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.EnableSystemDiagnosticsTracing();
    }
}

的Global.asax.cs

public class WebApiApplication
{
    protected void ApplicationStart()
    {   
        WebApiAuthConfig.Register(GlobalConfiguration.Configuration);
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        AutoMapperConfig.RegisterMappings();

        GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    }
}

在项目中访问时,路由工作正常。但是,当HttpClient尝试使用上述路径(Api /../ ..)联系ApiController时,它无法联系控制器。看起来它与路线混淆了。

3 个答案:

答案 0 :(得分:0)

您可能会发现将API分解为单独的项目会更好。然后,您可能还需要分解Web和API项目都依赖的公共数据访问项目,但最终的合理化结构将使您更容易解决您描述的类型的配置问题并在一个区域中构建失败,例如API不会阻止其他项目的建立。

答案 1 :(得分:0)

在WebApiConfig.cs中 你的routeTemplate应该是“api / {controller} / {action} / {id}”吗?

答案 2 :(得分:0)

不要在代码的WebApi部分中设置标准Web路由,而是考虑以相反的方式进行,在代码的标准Web路由部分中设置WebApi路由。这适用于我有权访问的项目:

public class MvcApplication : HttpApplication {
   protected void Application_Start() {
      GlobalConfiguration.Configure(WebApiConfig.Register);
      RouteConfig.RegisterRoutes(RouteTable.Routes);
      ...
   }
}

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

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

public static class WebApiConfig {
   public static void Register(HttpConfiguration config) {
      config.MapHttpAttributeRoutes();

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