Контроллер WebApi вернул значение в Entity Framework 5 и проекте MVC 4

я работаю над webapi, EF5, Windsor Castle в проекте MVC 4, и у меня есть вопрос ... я должен вернуть Entity (или DTO) в методе Get или я должен вернуть HttpResponseMessage? Какие's лучший способ и более стандартный способ сделать это?

Итак, это так?

[System.Web.Http.HttpGet]
public HttpResponseMessage GetById(long id)
{
    var branch = Uow.Branches.GetById(id);
    if (branch != null)
    {
        Request.CreateResponse(HttpStatusCode.OK, branch);
    }

    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}

Или это?

[System.Web.Http.HttpGet]
public Branch GetById(long id)
{
    var branch = Uow.Branches.GetById(id);
    if (branch != null) return branch ;
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}

Ответы на вопрос(2)

Зависит. Тем не менее, в вашем примере, поскольку две версии действия Get дают одинаковый ответ, я бы возвратил объект Branch вместо HttpResponseMessage. Это связано с тем, что инфраструктура поможет абстрагироваться от фактического создания HttpResponseMessage, поэтому действие фокусируется больше на бизнес-логике.

Если вам нужен больший контроль над сообщением об ответе (т. Е. Установка другого кода состояния), чем я бы вместо этого возвратил HttpResponseMessage.

Надеюсь это поможет.

Решение Вопроса

Я верну DTO, завернутый в HttpResponseMessage, как показано ниже:

return this.Request.CreateResponse(HttpStatusCode.OK, branch);

DTO / ViewModel позволит отправлять только необходимые свойства.

HttpResponseMessage позволяет отправить дополнительный код состояния, например, в случае неправильного ввода, мы можем отправить предварительное условие statusCode не выполнено.

if (model.EventDate == null)
            {
                var responseMessage = new HttpResponseMessage();
                responseMessage.StatusCode = HttpStatusCode.PreconditionFailed;
                responseMessage.ReasonPhrase = "Please enter valid EventDate input";
                return responseMessage;

            }

Ваш ответ на вопрос