WebApi和MVC 4:GetById和服务在单独的项目中

时间:2012-11-12 04:30:31

标签: asp.net-mvc-4 asp.net-web-api

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

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,);
}

[System.Web.Http.HttpGet]
public HttpResponseMessage Get(int id)
{
    var car= Uow.Cars.GetById(id);
    if (car!= null) {
        return car;
    }
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}

我想关注RESTfull回复。

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

我问这个是因为在同一个控制器中,返回一个View的服务和处理听起来像将服务耦合到将要使用它的客户端。

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

[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));
}

实施Get in the service。

2 个答案:

答案 0 :(得分:1)

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

当操作创建资源时,使用HttpResponseMessage作为返回类型,可以为您提供更灵活的选项来设置状态代码(201)以及可以访问创建的资源的位置。有关详细信息,请参阅此post

REST并不关心您使用它的方式当调用者请求资源时,服务器应该以调用者可以使用正确的状态代码接受它的格式返回资源(如果存在其他404则为200)。 / p>

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

答案 1 :(得分:0)

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

第2点: 为观看和休息呼叫设置单独的控制器是个好主意。我建议让控制器具有相同的名称但在不同的命名空间中,然后分别处理http调用(但在其余调用之前加上'/ api /'。在ViewResult和HttpResponseMessage / Car的同一个控制器中有不同的操作是一个选项但也不是那么整洁。