我想在我的Web Api中添加一条新路径,它会读取各种ID,然后过滤掉一堆书。
所以最后的网址应该是http://localhost/api/books/1/1/1/1
现在我已经添加了一条到RouteConfig
的路线,如下所示: -
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "BookFilter",
url: "api/books/{author}/{title}/{genre}/{isbn}",
defaults: new { controller = "Books", action = "BookFilter" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
我还在BooksController
中添加了以下内容: -
[HttpGet]
public IQueryable<BookDTO> BookFilter(int authorId, int titleId, int genreId, int isbn)
{
//filter books here
return db.Books.ProjectTo<BookDTO>();
}
然而,当我尝试访问该页面时,我得到了404。
要访问我的网页需要做什么?
感谢您的帮助和时间
答案 0 :(得分:2)
Web API和MVC是独立的框架,每个框架都有不同的类型。你的路线不起作用的可能原因是你混淆了两者。具体来说,为了使它按照您的配置工作,您需要一个MVC控制器(即继承System.Web.Mvc.Controller
的控制器)。
因此,假设您想要使用Web API,如您的问题所示,首先需要确保控制器的正确定义。它应该继承自System.Web.Http.ApiController
。
public class BooksController : ApiController
{
[HttpGet]
public IHttpActionResult BookFilter(string author, string title, string genre, string isbn)
{
return Ok("Successful result");
}
}
接下来,您需要将路由放在WebApiConfig.cs
文件中,而不是RouteConfig.cs
文件中。不要忘记从RouteConfig.cs
文件中删除您的路线。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "BookFilter",
routeTemplate: "api/books/{author}/{title}/{genre}/{isbn}",
defaults: new { controller = "Books", action = "BookFilter" });
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
您还需要确保对GlobalConfiguration.Configure(WebApiConfig.Register);
的调用位于应用程序启动路径中(默认情况下为Global.asax
)。
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
答案 1 :(得分:0)
确保在您的操作中使用相同的参数名称(例如,将 author 更改为 authorId ):
或者,您也可以在RouteConfig中为这些参数指定默认值,如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "BookFilter",
url: "api/books/{authorId}/{titleId}/{genreId}/{isbn}",
defaults: new { controller = "Books", action = "BookFilter", authorId= UrlParameter.Optional, titleId = UrlParameter.Optional, genreId = UrlParameter.Optional, isbn = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
控制器:
[HttpGet]
public IQueryable<BookDTO> BookFilter(int authorId, int titleId, int genreId, int isbn)
{
//filter books here
return db.Books.ProjectTo<BookDTO>();
}