Альтернатива Web API
Если на данный момент вы уже некоторое время пользовались ASP.NET MVC, то вы, возможно, уже использовали регулярный контроллер, который служил бы конечной точкой простой веб-службы. Если вы использовали версию ASP.NET MVC (v1-v3), в которую не входил Web API, то рассмотрим следующий прием, который будет в будущем создавать простой путь обновления для API контроллера.
В следующем листинге вы можете увидеть регулярный ASP.NET MVC контроллер, который используется для тех же целей, что и GuestbookEntryController
(из листинга 24-3).
Листинг 24-5: MVC контроллер, который использует приемы, схожие с Web API
using System.Linq;
using System.Web.Mvc;
using GuestBook.Models;
using Guestbook.Models;
namespace GuestBook.Controllers
{
public class GuestbookEntryMvcController : Controller
{
private IGuestbookRepository _repository;
public GuestbookEntryMvcController()
{
_repository = new GuestbookRepository();
}
public GuestbookEntryMvcController(IGuestbookRepository repository)
{
_repository = repository;
}
public JsonResult Index()
{
var mostRecentEntries = _repository.GetMostRecentEntries();
return Json(mostRecentEntries);
}
public JsonResult Show(int id)
{
var entry = _repository.FindById(id);
if (entry == null)
{
Response.Clear();
Response.StatusCode = 404;
Response.End();
}
return Json(entry);
}
[HttpPost]
public ActionResult Create(GuestbookEntry value)
{
if (!ModelState.IsValid)
{
var errors =
(from state in ModelState
where state.Value.Errors.Any()
select new
{
state.Key,
Errors = state.Value.Errors.Select(
error => error.ErrorMessage)
})
.ToDictionary(error => error.Key,
error => error.Errors);
return Json(errors);
}
_repository.AddEntry(value);
Response.StatusCode = 200;
Response.End();
return new EmptyResult();
}
}
}
Строка 7: Наследуется от MVC контроллера
Строка 18: Использует
GET
перечисление
Строка 23: Возвращает JSON данные для единичной записи
Строка 35: Публикация новой записи с помощью
POST
Этот контроллер не использует возможности Web API, поэтому если вы работаете с ранней версией ASP.NET MVC, то вы можете использовать этот прием, чтобы удостовериться в ранней совместимости с апгрейдером. Этот контроллер наследуется от System.Web.Mvc.Controller. Действие GET
для перечисления многочисленных записей возвращает JSON
, как это делает действие Show
для единичных записей. Действие POST
завершает контроллер, добавляя возможность публиковать новые записи.
И снова этот контроллер использует те же приемы, что и Web API контроллер, но он построен при помощи использования подхода обычного ASP.NET MVC контроллера. Если вы используете предыдущую версию ASP.NET MVC, то рассмотрите использование этого подхода как способ облегчения вашего перехода на Web API в будущем.