为什么这个 Web Api 路由不起作用?
Why doesn't this Web Api route work?
我声明了这些路由和控制器:
public class RouteConfig
{
public static readonly string MVC_ROUTING = "Default";
public static readonly string WEB_API_ROUTING = "Api";
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: MVC_ROUTING,
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { id = @"^[0-9]*$" }
);
routes.MapRoute(
name: WEB_API_ROUTING,
url: "api/{controller}/{action}/{id}",
defaults: new {id = UrlParameter.Optional },
constraints: new { id = @"^[0-9]*$" }
);
}
}
public class QuoteController : ApiController
{
private readonly QuoteService quoteService;
public QuoteController()
{
quoteService = new QuoteService();
}
// GET api/<controller>
public IEnumerable<QuoteModel> Get()
{
return quoteService.GetAllQuotes().Map<QuoteModel>();
}
// GET api/<controller>/5
public QuoteModel Get(int id)
{
return quoteService.GetQuoteById(id).Map<QuoteModel>();
}
// POST api/<controller>
public HttpResponseMessage Post(QuoteModel quoteModel)
{
Quote quote = quoteModel.Map<Quote>();
quoteService.AddNewQuote(quote);
string uri = Url.Link(RouteConfig.WEB_API_ROUTING, new { id = quote.QuoteId,controller="Quote",action="Get"});
return Request.CreateResponse(HttpStatusCode.OK, uri);
}
// PUT api/<controller>/5
public void Put(QuoteModel quote)
{
quoteService.Update(quote.Map<Quote>());
}
// DELETE api/<controller>/5
public void Delete(int id)
{
quoteService.DeleteQuote(id);
}
}
我不明白为什么这些路线有效:
但是这个没有:
在您的 get 方法之上添加一个路由属性。
[Route("{id}")]
public QuoteModel Get(int id)
{
return quoteService.GetQuoteById(id).Map<QuoteModel>();
}
部分问题是您在 RouteConfig 而不是 WebApiConfig 中注册了 Api 路由。
从 RouteConfig 中删除 Web Api 路由,然后打开 WebApiConfig.
您可能已经在 WebApiConfig 中设置了默认路由;更改其中的路线如下:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "Api",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"\d*", action = @"[a-zA-Z]+" }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"\d*" }
);
}
}
您现在应该可以到达上面列出的所有路线。
更好的选择是使用属性路由,您可以阅读 here.
我声明了这些路由和控制器:
public class RouteConfig
{
public static readonly string MVC_ROUTING = "Default";
public static readonly string WEB_API_ROUTING = "Api";
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: MVC_ROUTING,
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { id = @"^[0-9]*$" }
);
routes.MapRoute(
name: WEB_API_ROUTING,
url: "api/{controller}/{action}/{id}",
defaults: new {id = UrlParameter.Optional },
constraints: new { id = @"^[0-9]*$" }
);
}
}
public class QuoteController : ApiController
{
private readonly QuoteService quoteService;
public QuoteController()
{
quoteService = new QuoteService();
}
// GET api/<controller>
public IEnumerable<QuoteModel> Get()
{
return quoteService.GetAllQuotes().Map<QuoteModel>();
}
// GET api/<controller>/5
public QuoteModel Get(int id)
{
return quoteService.GetQuoteById(id).Map<QuoteModel>();
}
// POST api/<controller>
public HttpResponseMessage Post(QuoteModel quoteModel)
{
Quote quote = quoteModel.Map<Quote>();
quoteService.AddNewQuote(quote);
string uri = Url.Link(RouteConfig.WEB_API_ROUTING, new { id = quote.QuoteId,controller="Quote",action="Get"});
return Request.CreateResponse(HttpStatusCode.OK, uri);
}
// PUT api/<controller>/5
public void Put(QuoteModel quote)
{
quoteService.Update(quote.Map<Quote>());
}
// DELETE api/<controller>/5
public void Delete(int id)
{
quoteService.DeleteQuote(id);
}
}
我不明白为什么这些路线有效:
但是这个没有:
在您的 get 方法之上添加一个路由属性。
[Route("{id}")]
public QuoteModel Get(int id)
{
return quoteService.GetQuoteById(id).Map<QuoteModel>();
}
部分问题是您在 RouteConfig 而不是 WebApiConfig 中注册了 Api 路由。 从 RouteConfig 中删除 Web Api 路由,然后打开 WebApiConfig.
您可能已经在 WebApiConfig 中设置了默认路由;更改其中的路线如下:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "Api",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"\d*", action = @"[a-zA-Z]+" }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"\d*" }
);
}
}
您现在应该可以到达上面列出的所有路线。 更好的选择是使用属性路由,您可以阅读 here.