Routing 不使用基于约定的路由的web api属性路由
我在一个解决方案中有web api(owin托管)和MVC项目。如果基于约定但属性路由不起作用,则我的web api路由可以工作。为了测试属性路由,我删除了web api路由的默认基于约定的配置。我有以下条目 startup.csRouting 不使用基于约定的路由的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
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。再次感谢。