1

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

路由配置.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();
    }
}

全球.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 时,它无法联系到控制器。它似乎与路线混淆。

4

3 回答 3

1

与其在代码的 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}
      );
   }
}
于 2016-03-10T00:15:48.673 回答
0

您可能会发现将您的 API 分解到一个单独的项目中会更好。然后,您可能还需要考虑您的 Web 和 API 项目都依赖的通用数据访问项目,但由此产生的合理化结构将更容易解决您描述的配置问题并在一个领域构建故障,例如 API 不会停止其他项目的建设。

于 2014-04-02T08:59:13.220 回答
-1

在 WebApiConfig.cs 中,您的 routeTemplate 应该是api/{controller}/{action}/{id}

于 2014-04-02T11:54:10.020 回答