Как я могу написать приложение MVC3 / 4, которое может функционировать как веб-API и пользовательский интерфейс для этого API? - PullRequest
7 голосов
/ 03 апреля 2012

Мое название довольно хорошо подводит итог.Сначала я предоставил несколько форматов данных, один из которых - HTML, который я могу предоставить и использовать с помощью механизма представления Razor и действий контроллера MVC3 соответственно.Затем, возможно, предоставьте другие форматы данных с помощью пользовательских механизмов просмотра.Я никогда прежде не работал в этой области, за исключением очень простых веб-сервисов, очень давно.Какие у меня есть варианты?Что это за веб-API, который, как я вижу, связан с MVC4?

ПРИМЕЧАНИЕ : моему основному приложению HTML не нужно работать напрямую с API.Я хотел бы сначала написать API, основанный на требованиях скелетного клиента HTML, с очень элементарным пользовательским интерфейсом, и после того, как API будет закрыт, затем напишите полнофункциональный клиент пользовательского интерфейса, использующий те же сервисы, что и API, но в обходкомпоненты API анализа и представления фактических данных.

Ответы [ 9 ]

8 голосов
/ 03 апреля 2012

У меня возникла та же мысль, как только закончился первый разговор о Web API.Короче говоря, веб-API - это новый продукт из веб-стека MS .NET, основанный на WCF, OData и MVC, который обеспечивает единообразные средства для создания веб-API RESTful.На это есть много ресурсов, так что воспользуйтесь Google.

Теперь перейдем к вопросу ..

Проблема в том, что вы, конечно, можете заставить Web API возвращать HTML, JSON, XML и т. Д.- но здесь отсутствует часть представлений / шаблонов, предоставляемая Razor / ASPX / insertviewengine здесь.На самом деле это не «API».

Конечно, вы могли бы написать код на стороне клиента для вызова вашего Web API и выполнить на стороне клиента шаблон / пользовательский интерфейс с огромным количеством доступных плагинов.

Я почти уверен, что веб-API не способен возвращать шаблонный HTML так же, как веб-приложение ASP.NET MVC.

Так что, если вы хотите «повторно использовать»Для определенных частей вашего приложения (репозиторий, домен и т. д.), вероятно, было бы лучше обернуть вызовы в своего рода слой фасадов / служб и сделать так, чтобы и ваш веб-API, и отдельный веб-приложение ASP.NET MVC вызывали это для уменьшения кода.

Все, что вам нужно, это веб-приложение ASP.NET MVC, которое вызывает ваш домен и создает шаблон HTML, а также приложение ASP.NET Web API, которое вызывает ваш домен и возвращает различные ресурсы (JSON., XML и т. Д.).

Если у вас хорошо структурированное приложение, тогда эта форма абстракции не должна быть проблемой.

2 голосов
/ 10 апреля 2012

Я бы посоветовал разработать ваше приложение таким образом, чтобы вы использовали один контроллер для возврата начальных ресурсов приложения (html, javascript и т. Д.) В браузер. Создайте свой API / логику в службах конечных точек WebAPI и получите доступ к этим службам через JavaScript. По сути, создание одностраничного приложения. Используя MVC 4, наш контроллер может возвращать разные виды в зависимости от устройства (телефон, рабочий стол, планшет), но при использовании того же JavaScript все ваши клиенты смогут получить доступ к услуге.

Хорошие библиотеки для изучения включают KnockoutJS , SammyJS или BackBoneJS

1 голос
/ 04 июля 2012

У Фредерика Нормена есть хорошая статья об использовании Razor вместе с ASP.NET Web API: http://weblogs.asp.net/fredriknormen/archive/2012/06/28/using-razor-together-with-asp-net-web-api.aspx

Одним из важных ограничений хорошо спроектированной службы REST является использование «гипермедиа как движка состояния приложения» (HATEOAS - http://en.wikipedia.org/wiki/HATEOAS).

Мне кажется, что HTML является отличным выбором для поддержки в качестве одного из медиаформатов. Это позволило бы разработчикам и другим пользователям просматривать и взаимодействовать с вашим сервисом без специально созданного клиента. Что, в свою очередь, вероятно, приведет к более быстрому развитию клиента к вашим услугам. (Когда речь идет о разработке реальных клиентов HTML, было бы более разумно использовать json или xml.) Это также вынудило бы команду разработчиков создать более качественную службу отдыха, поскольку вам придется структурировать свои представления таким образом, чтобы облегчить навигация конечных пользователей с помощью браузера.

Я думаю, что для любой команды разработчиков было бы разумно рассмотреть возможность использования подхода, подобного примеру Фредерика, и создать средство форматирования медиа-типа, которое генерирует пользовательский интерфейс HTML для службы отдыха, основанный на отражении типа возврата и использовании соглашений (или чего-то подобного). аналогично - с учетом этого я бы позаботился о том, чтобы формат html media использовался только разработчиками для исследования. Возможно, вы сделаете его доступным только в определенных средах.).

Я почти уверен, что в конечном итоге сделаю что-то подобное (если кто-то еще этого не сделал или если в веб-API нет какой-либо другой функции, которая делает это. Я немного новичок в Web API) , Может быть, это будет мой первый пакет NuGet. :) Если так, я отправлю сюда, когда это будет сделано.

1 голос
/ 11 апреля 2012

Вот что нужно прочитать по MVC и веб-API - С HTTP ваше приложение - это ваш API .

1 голос
/ 06 апреля 2012

Я играл с этой идеей раньше. Я выставил API через MVC3 как методы JSONResult на разных контроллерах. Я реализовал пользовательскую безопасность для API с помощью фильтров действий контроллера. Затем построил очень тяжелый AJAX-интерфейс HTML, который использовал сервисы JSON. Он работал довольно хорошо и имел отличную производительность, поскольку все данные, передаваемые для веб-приложения, передавались через AJAX.

1 голос
/ 03 апреля 2012

Если у вас есть требование возвращать HTML с использованием WebAPI, например, чтобы позволить пользователям щелкать и изучать ваш API, используя тот же URL, тогда вы можете использовать маршрутизацию \ обработчик html-сообщений.

public class HtmlMessageHandler : DelegatingHandler
{
    private List<string> contentTypes = new List<string> { "text/html", "application/html", "application/xhtml+xml" };

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {                                
        if (request.Method == HttpMethod.Get && request.Headers.Accept.Any(h => contentTypes.Contains(h.ToString())))
        {
            var response = new HttpResponseMessage(HttpStatusCode.Redirect);

            var htmlUri = new Uri(String.Format("{0}/html", request.RequestUri.AbsoluteUri));
            response.Headers.Location = htmlUri;

            return Task.Factory.StartNew<HttpResponseMessage>(() => response);
        }
        else
        {
            return base.SendAsync(request, cancellationToken);
        }
    }
}    

Для полного примера проверьте: - https://github.com/arble/WebApiContrib.MessageHandlers.Html

0 голосов
/ 07 июня 2012

Теперь, когда бета-версия прошла совсем немного времени, MS только что выпустила версию Release Candidate MVC4 / VS2012 / etc.Говоря о страницах навигации / помощи (упомянутых некоторыми другими авторами), они добавили новый класс IApiExplorer.Мне удалось собрать самодокументирующуюся страницу справки, которая автоматически собирает все мои ApiControllers и использует уже введенные комментарии для их документирования.

Моя рекомендация с точки зрения архитектуры, как и другиетакже будет абстрагировать ваше приложение в нечто вроде «MVCS» (Модель, Представление, Контроллер, Сервисы), которое вы можете знать как что-то еще.То, что я сделал, это разделил мои модели в отдельную библиотеку классов, а затем разделил мои службы в другую библиотеку.После этого я использую внедрение зависимостей с помощью Ninject / Ninject MVC3, чтобы подключить свои реализации по мере необходимости, и просто использую интерфейсы для сбора нужных мне данных.Когда у меня есть данные (которые, конечно же, представлены моими моделями), я делаю все, что нужно, чтобы настроить их для представления и отправляю обратно клиенту.

Исходя из MVC3, у меня есть один проект, которыйЯ портировал на MVC4, который использует «традиционную» разметку Razor и тому подобное, и новый проект, который будет одностраничным приложением AJAX с использованием Backbone + Marionette и некоторыми другими вещами. Пока что опыт был действительно велик, этосупер прост в использовании.Я нашел здесь несколько хороших учебных пособий по Backbone + Marionette, хотя они могут быть немного запутанными и требуют небольшого изучения документации, чтобы собрать их воедино, легко, как только вы освоите их:

Basicвведение в Backbone.js: http://arturadib.com/hello-backbonejs/docs/1.html

Варианты использования для представлений марионеток (я нашел это полезным, когда решал, как создавать представления для моих сложных моделей): https://github.com/derickbailey/backbone.marionette/wiki/Use-cases-for-the-different-views

0 голосов
/ 06 апреля 2012

Создание Html - это работа для контроллера Mvc, а не для Web Api, поэтому, если вам нужно что-то, что может возвращать как jSon, так и Html, сгенерированные с помощью некоторого механизма представления, лучшим вариантом является стандартный метод действия Mvc Controller Action.Согласование контента, то есть формат для возврата, может быть достигнуто с помощью Fiter Action.У меня есть фильтр действий, который позволяет контроллеру получать «подсказки» от клиента о возвращаемом формате.Клиент может попросить вернуть представление с определенным именем или jSon.Подсказка отправляется либо в строке запроса, либо в скрытом поле (если запрос поступает из формы отправки).Код ниже:

public class AcceptViewHintAttribute : ActionFilterAttribute
{
    private JsonRequestBehavior jsBehavior;
    public AcceptViewHintAttribute(JsonRequestBehavior jsBehavior = JsonRequestBehavior.DenyGet)
    {
        this.jsBehavior = jsBehavior;
    }
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        string hint = filterContext.RequestContext.HttpContext.Request.Params["ViewHint"];
        if (hint == null) hint = filterContext.RequestContext.RouteData.Values["ViewHint"] as string;
        if (!string.IsNullOrWhiteSpace(hint) && hint.Length<=100 && new Regex(@"^\w+$").IsMatch(hint) )
        {


                ViewResultBase res = filterContext.Result as ViewResultBase;
                if (res != null)
                {
                    if (hint == "json")
                    {
                        JsonResult jr = new JsonResult();
                        jr.Data = res.ViewData.Model;
                        jr.JsonRequestBehavior = jsBehavior;
                        filterContext.Result = jr;
                    }
                    else
                    {
                        res.ViewName = hint;
                    }
                }

        }
        base.OnActionExecuted(filterContext);
    }
}
0 голосов
/ 03 апреля 2012

Вы видели это видео ?Возможно, вы захотите скачать его перед просмотром, чтобы он не пропустил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...