4

我正在尝试使用新的 ASP.NET Web API 来执行以下操作:

/api/business/{id}获取企业目录信息的 GET 。对同一 URL 的 PUT 会更新信息等。该部分工作正常。当我想添加以前的操作以查看对该业务的评论时,我遇到了问题。理想情况下,我希望在/api/business/{id}/reviewsGET 可以返回评论,POST 提交新评论,等等。

在普通的 ASP.NET MVC 应用程序中,我可以定义两个操作方法(Reviews 和 PostReview),然后使用属性来更改操作名称并接受第二个函数的 HTTP 方法。我希望有一些方法可以用新系统中的类来做到这一点,但我无法弄清楚它是什么,而且我在文档中没有看到任何关于这个问题的信息。

使用区域不起作用据我所知:我需要/business/{id}URL 才能工作并使用中断的区域。

4

3 回答 3

13

Web API 确实支持按操作路由,因此您可以执行以下操作:

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new { action = "DirectoryInfo", id = RouteParameter.Optional }
);

控制器方法:

[HttpGet]
[ActionName("DirectoryInfo")]
public void GetDirectoryInfo(int id)

[HttpPut]
[ActionName("DirectoryInfo")]
public void PutDirectoryInfp(int id)

[HttpGet]
public void Review(int id)

[HttpPost]
[ActionName("Review")]
public void PostReview(int id)

另一种选择是创建两个控制器,BusinessController 和 ReviewController,并创建以下路由:

routes.MapHttpRoute(
    name: "BusinessRoute", 
    routeTemplate: "api/business/{id}", 
    defaults: new { controller = "Business", id = RouteParameter.Optional }
    );
routes.MapHttpRoute(
    name: "reviewsRoute", 
    routeTemplate: "api/contacts/{id}/reviews/", 
    defaults: new { controller = "Reviews", id = RouteParameter.Optional}
    );

然后使用 Web API 样式的隐式操作名称。

于 2012-04-06T18:04:26.847 回答
1

使用区域不起作用,据我所知:我需要 /business/{id} URL 才能工作并使用中断的区域。

DefaultHttpControllerSelector作为记录,您可以通过覆盖ASP.NET MVC来让 Areas 和 WebApi 正常运行。我已经在工作中的 ASP.NET MVC 中解决了这个问题。请参阅以下博客了解我的实现以及有关如何将区域支持引入 WebApi 的更多详细信息:

http://blogs.infosupport.com/asp-net-mvc-4-rc-getting-webapi-and-areas-to-play-nicely/

于 2012-08-16T18:02:43.613 回答
1

DDD的角度来看,如果 review 是一个聚合(它有自己的存储库),那么它需要自己的控制器。如果 Post 是它的根聚合,那么它必须与 Post 本身一起返回。

形成我所看到的,它是一个根聚合,因此它需要它自己的控制器。因此你有:

/api/reviews/{id}

或者

/api/reviews?postId={postId}

其中 id 是 post 的。


这主要是因为我们没有行动了。我对此并不完全满意,但这就是我们所拥有的。

于 2012-04-05T15:56:28.013 回答