Asp.net mvc 4 WebApi和MVC4:GetById和服务在单独的项目中

Asp.net mvc 4 WebApi和MVC4:GetById和服务在单独的项目中,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我正在使用webapi,MVC4项目。(使用存储库模式和工作单元) 我有两个问题 1) WebApi的GetById应该返回实体还是HttpResponseMessage? 如果是HttpResponseMessage,那么应该是 [System.Web.Http.HttpGet] public HttpResponseMessage Get(int id) { var car = Uow.Cars.GetById(id); return car == null ? Reques

我正在使用webapi,MVC4项目。(使用存储库模式和工作单元) 我有两个问题

1) WebApi的GetById应该返回实体还是HttpResponseMessage? 如果是HttpResponseMessage,那么应该是

[System.Web.Http.HttpGet]
public HttpResponseMessage Get(int id)
{
    var car = Uow.Cars.GetById(id);
    return car == null ? Request.CreateResponse(HttpStatusCode.OK, car) : Request.CreateResponse(HttpStatusCode.NotFound,);
}

我想关注所有的回复

2) 将webapi服务与UI分开是否合乎逻辑?我的意思是在一个webapi项目中,控制器使用基本的ApiController和CRUD http操作,因此可以从任何地方/任何设备直接调用它们,然后是另一个webapi/MVC4项目,它将调用webapi项目的服务

我这样问是因为在同一个控制器中有服务和返回视图的处理(例如)听起来像是将服务耦合到将使用它的客户端

例如: 从中(在同一webapi控制器中):

转到以下位置:

public ViewResult Details(long id)
{
    return View(webapiService.Cars.Get(id));
}
在服务中实现Get。

第1点: 在Web API的情况下,从操作返回实体是合乎逻辑的,但是我们无法控制HttpResponseMessage属性(如HttpStatusCode)。除了返回实体总是一种更干净的方法。我们可以在各自的过滤器中控制序列化、格式化等,以完成我们的工作。但您永远不能选择性地返回car/HttpResponseMessage,因为编译器不允许您编译返回类型为HttpResponseMessage和返回类型为car的方法

第2点: 为视图和rest调用使用单独的控制器是一个好主意。我建议使用名称相同但名称空间不同的控制器,然后分别路由处理http调用(但在rest调用前加上“/api/”。在同一控制器中对ViewResult和HttpResponseMessage/Car执行不同的操作也是一个选项,但不是干净和独立的。

第1点: 在Web API的情况下,从操作返回实体是合乎逻辑的,但是我们无法控制HttpResponseMessage属性(如HttpStatusCode)。除了返回实体始终是一种更干净的方法之外。我们可以在各自的筛选器中控制序列化、格式设置等,以完成我们的工作。但您永远不能选择性地返回car/HttpResponseMessage,因为编译器不允许您编译返回类型为HttpResponseMessage和返回类型为car的方法

第2点:
为视图和rest调用使用单独的控制器是个好主意。我建议使用名称相同但名称空间不同的控制器,然后路由分别处理http调用(但是在rest调用前加上“/api/”。在同一个控制器中为ViewResult和HttpResponseMessage/Car执行不同的操作也是一个选项,但没有那么干净和独立。

您可以使用
HttpResponseMessage
或实体
Car
作为返回类型。如果使用
HttpResponseMessage
,您将获得更多信息。)控件在创建响应时自定义某些HTTP属性

当操作创建资源时,然后使用
HttpResponseMessage
作为返回类型,为您提供了非常灵活的选项来设置状态代码(201)和可访问所创建资源的位置。有关更多信息,请参阅此

REST不关心您使用哪种方式它所关心的是,当调用者请求资源时,服务器应以调用者可以接受的格式返回资源,并带有正确的状态代码(如果存在,则为200,否则为404)


如果确实可以选择从不同的客户端使用该服务,则可以将WebAPI控制器移动到单独的项目中,否则请避免这样做。一旦将WebAPI控制器移动到单独的项目中,当您尝试从MVC项目中的javascript使用它时,您将面临跨域问题。

您可以使用
HttpResponseMessage
或实体
Car
作为返回类型。如果使用
HttpResponseMessage
,则在创建响应时可以更好地控制自定义某些HTTP属性

当操作创建资源时,然后使用
HttpResponseMessage
作为返回类型,为您提供了非常灵活的选项来设置状态代码(201)和可访问所创建资源的位置。有关更多信息,请参阅此

REST不关心您使用哪种方式它所关心的是,当调用者请求资源时,服务器应以调用者可以接受的格式返回资源,并带有正确的状态代码(如果存在,则为200,否则为404)


如果确实可以选择从不同的客户端使用该服务,则可以将WebAPI控制器移动到单独的项目中,否则请避免这样做。一旦将WebAPI控制器移动到单独的项目中,当您尝试从MVC项目中的javascript使用它时,将面临跨域问题。

关于Point1答案。我知道如果返回类型是HttpResponseMessage,我就不能返回汽车。我的问题是RESTfull的内容是怎么说的。呼叫者是否需要实体?关于点1答案。我知道如果返回类型是HttpResponseMessage,我就不能返回汽车。我的问题是RESTfull的内容是怎么说的。呼叫者参与了吗y是否期望实体?
[System.Web.Http.HttpGet]
public HttpResponseMessage Get(int id)
{
    var car = Uow.Cars.GetById(id);
    return car!= null ? Request.CreateResponse(HttpStatusCode.OK, car) : Request.CreateResponse(HttpStatusCode.NotFound,);
}

public ViewResult Details(long id)
{
    return View(Get(id));
}
public ViewResult Details(long id)
{
    return View(webapiService.Cars.Get(id));
}