【发布时间】:2018-07-17 17:36:42
【问题描述】:
我有 ProductsController 和 OwnersController:
public class ProductsController : ApiController
{
//constructor is here
// GET /api/products
public IHttpActionResult GetProducts()
{
return Ok(new ApiResponse());
}
// GET /api/products/{productCode}
[HttpGet, Route("api/products/{productCode}")]
public IHttpActionResult GetProductByCode(string productCode)
{
return Ok(new ApiResponse());
}
// POST /api/products
public IHttpActionResult PostProduct(Product product /*my class*/)
{
return CreatedAtRoute("DefaultApi", new { id = product.Id }, product);
}
}
完美运行。 但是现在我创建了第二个控制器并执行相同的操作,但是 在尝试 POST 方法时出现错误。另一种方法效果很好!
我们先看一下代码:
public class OwnersController : ApiController
{
// constructor
// GET /api/owners/{label}
// GET /api/owners/{label}?skip=1&take=4
[Route("api/owners/{label}")]
public IHttpActionResult GetOwnersExamples(string label, int skip=0, int take=10)
{
return Ok(new ApiResponse());
}
// POST /api/owners/{productCode}
//[HttpPost]
[Route("api/owners/{productCode}"/*, Name = "CreateOwner"*/)]
public IHttpActionResult PostOwner(string productCode, Owner owner)
{
return CreatedAtRoute("DefaultApi", new { id = Owner.Id }, owner);
}
}
错误信息:
UrlHelper.Link 不能返回 null
我的RouteConfig:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
据我了解,CreateAtRoute 方法必须得到另一个 RouteName。如您所见,我可以通过添加 Route Name 参数(现在评论)并用 "CreateOwner" 替换 "DefaultApi" 来解决问题,但它看起来像一个 hack。我相信还有另一种方法可以避免Name Property。
附:看起来我的 Web API 只能看到第一个控制器 (ProductsController) - 如果我删除显式 Route [Route("...")]...
【问题讨论】:
-
错误出现在哪一行?你能提供一个堆栈跟踪吗?
标签: c# asp.net .net routing asp.net-web-api2