Routing 不使用基于约定的路由的web api属性路由

Routing 不使用基于约定的路由的web api属性路由,routing,asp.net-web-api2,owin,asp.net-web-api-routing,attributerouting,Routing,Asp.net Web Api2,Owin,Asp.net Web Api Routing,Attributerouting,我在一个解决方案中有web api(owin托管)和MVC项目。如果基于约定但属性路由不起作用,则我的web api路由可以工作。为了测试属性路由,我删除了web api路由的默认基于约定的配置。我有以下条目 startup.cs public partial class Startup { public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); ap

我在一个解决方案中有web api(owin托管)和MVC项目。如果基于约定但属性路由不起作用,则我的web api路由可以工作。为了测试属性路由,我删除了web api路由的默认基于约定的配置。我有以下条目

startup.cs

public partial class Startup
 {

   public void Configuration(IAppBuilder app)
   { 
    var config = new HttpConfiguration();
     app.Map("/api", inner =>
        {
            ConfigureWebApi(config);
            inner.UseWebApi(config);
        });
   }

   public void ConfigureWebApi(HttpConfiguration config)
   {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
   } // no default convention based routing
public class ProductsController : ApiController
 {
    [Route("api/products")]
    public IHttpActionResult Get()
    {

    }

     [Route("api/products/TopCategories"),HttpGet]
    public IHttpActionResult GetTopCategories()
    {

    }
 }
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 class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        //web api routes from startup.cs
        //GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}
ProductsController.cs

public partial class Startup
 {

   public void Configuration(IAppBuilder app)
   { 
    var config = new HttpConfiguration();
     app.Map("/api", inner =>
        {
            ConfigureWebApi(config);
            inner.UseWebApi(config);
        });
   }

   public void ConfigureWebApi(HttpConfiguration config)
   {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
   } // no default convention based routing
public class ProductsController : ApiController
 {
    [Route("api/products")]
    public IHttpActionResult Get()
    {

    }

     [Route("api/products/TopCategories"),HttpGet]
    public IHttpActionResult GetTopCategories()
    {

    }
 }
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 class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        //web api routes from startup.cs
        //GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}
我不想依赖MVC路由实现web api,但万一这里缺少什么,请告诉我

routeconfig.cs

public partial class Startup
 {

   public void Configuration(IAppBuilder app)
   { 
    var config = new HttpConfiguration();
     app.Map("/api", inner =>
        {
            ConfigureWebApi(config);
            inner.UseWebApi(config);
        });
   }

   public void ConfigureWebApi(HttpConfiguration config)
   {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
   } // no default convention based routing
public class ProductsController : ApiController
 {
    [Route("api/products")]
    public IHttpActionResult Get()
    {

    }

     [Route("api/products/TopCategories"),HttpGet]
    public IHttpActionResult GetTopCategories()
    {

    }
 }
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 class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        //web api routes from startup.cs
        //GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}
Global.asax.cs

public partial class Startup
 {

   public void Configuration(IAppBuilder app)
   { 
    var config = new HttpConfiguration();
     app.Map("/api", inner =>
        {
            ConfigureWebApi(config);
            inner.UseWebApi(config);
        });
   }

   public void ConfigureWebApi(HttpConfiguration config)
   {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
   } // no default convention based routing
public class ProductsController : ApiController
 {
    [Route("api/products")]
    public IHttpActionResult Get()
    {

    }

     [Route("api/products/TopCategories"),HttpGet]
    public IHttpActionResult GetTopCategories()
    {

    }
 }
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 class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        //web api routes from startup.cs
        //GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}
我使用了routeprefix,但出于测试目的删除了它。 我认为下面两个Url都应该工作,但由于某些原因,它们不工作,我得到404错误

(一) 2)

基于堆栈跟踪,出于某种原因,我认为我的MVC路由正在处理“/api”路由(我可能错了)


您是否希望将常量字符串“api”添加到uri两次?一次在app.map中,一次在route属性中。你试过api/api/产品吗?你是对的,比尔,api/api/产品有效。我修复了我的属性并从中删除了api。再次感谢。看起来您会两次向uri添加常量字符串“api”吗?一次在app.map中,一次在route属性中。你试过api/api/产品吗?你是对的,比尔,api/api/产品有效。我修复了我的属性并从中删除了api。再次感谢。