ASP.NET MVC и WCF - PullRequest
       36

ASP.NET MVC и WCF

27 голосов
/ 20 октября 2008

В данный момент я работаю в MVC, но в моем списке "Чтобы научиться в какой-то момент" у меня также есть WCF.

Мне просто интересно, является ли WCF чем-то, что следует / можно использовать в приложении MVC или нет? Фоном является то, что я хочу, чтобы настольное приложение (.NET 3.5, WPF) взаимодействовало с моим веб-сайтом MVC, и мне интересно, каков наилучший способ передачи данных между ними. Должен ли я просто использовать специальные представления / чтобы контроллеры возвращали JSON или XML (используя ContentResult)?

И, может быть, даже более важно, с другой стороны, могу ли я просто вызвать специальные контроллеры? Не уверен, как авторизация будет работать в таком контексте. Я могу либо использовать проверку подлинности Windows, либо (если на сайте выполняется проверка подлинности с помощью форм) пользователь может сохранить свои учетные данные в приложении, но затем я по сути создаю HTTP-клиент в своем приложении. Таким образом, хотя MVC => Application кажется действительно простым, Application => MVC кажется несколько сложным и возможным использованием WCF?

Я не пытаюсь использовать в этом WCF, но мне просто интересно, есть ли действительно хороший вариант использования WCF в приложении MVC.

Ответы [ 4 ]

47 голосов
/ 20 октября 2008

Службы WCF могут иметь смысл в этой ситуации, но не создавайте службы, соответствующие вашему пользовательскому интерфейсу, создавайте службы, соответствующие бизнес-процессам. то есть. у вас не будет службы, которая возвращает данные просмотра для каждой страницы, у вас будет служба, которая предоставляет логические операции. Затем ваш сайт может вызывать те же службы, которые вызывает клиент Windows, но вам не нужно связывать дизайн клиента Windows с дизайном веб-сайта.

Вместо этого:

Клиент Windows -> Услуги -> Веб-сайт

Должно быть:

Клиент Windows -> Услуги

Веб-сайт -> Услуги

9 голосов
/ 20 октября 2008

Вы можете использовать ADO.NET Data Services для обмена данными с JSON (для клиентов JavaScript) или XML (для настольных приложений).

ASP.NET MVC может затем воспользоваться этим, используя любой из двух в модели. Как вы, вероятно, знаете, службы данных ADO.NET основаны на WCF, поэтому вы были на правильном пути.

8 голосов
/ 16 июля 2009

Я использую asp.net mvc в качестве моего html-сайта (механизм просмотра по умолчанию) и конечной точки сервиса. Конечная точка службы используется моими клиентами WPF и Silverlight путем введения «content-type = text / xml» в заголовок запроса WebClient (см. post от ScottGu по использованию службы в SL, которая вдохновила этот подход) , Я нашел где-то в сети некоторый код, который переопределяет событие OnActionExecuted, например:

public class JsonOrXml : ActionFilterAttribute
{
    private static UTF8Encoding UTF8 = new UTF8Encoding(false);

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // setup the request, view and data
        HttpRequestBase request = filterContext.RequestContext.HttpContext.Request;
        ViewResult view = (ViewResult)(filterContext.Result);
        var data = view.ViewData.Model;

        String contentType = request.ContentType ?? string.Empty;

        // JSON
        if (contentType.Contains("application/json") || (string)view.ViewData["FORMAT"] == "json")
        {
            filterContext.Result = new JsonResult
            {
                Data = data
            };
        }

        // POX
        else if (contentType.Contains("text/xml") || (string)view.ViewData["FORMAT"] == "xml")
        {
            // MemoryStream to encapsulate as UTF-8 (default UTF-16)
            // http://stackoverflow.com/questions/427725/
            //
            // MemoryStream also used for atomicity but not here
            // http://stackoverflow.com/questions/486843/
            //using (MemoryStream stream = new MemoryStream(500))
            //{
            //    using (var xmlWriter =
            //        XmlTextWriter.Create(stream,
            //            new XmlWriterSettings()
            //            {
            //                OmitXmlDeclaration = false,
            //                Encoding = UTF8,
            //                Indent = true
            //            }))
            //    {
            //        new XmlSerializer(data.GetType()).Serialize(xmlWriter, data);
            //    }

            //    filterContext.Result = new ContentResult
            //    {
            //        ContentType = "text/xml",
            //        Content = UTF8.GetString(stream.ToArray()),
            //        ContentEncoding = UTF8
            //    };
            //}

            XmlDeclaration xmlDecl = new XmlDocument().CreateXmlDeclaration("1.0", "UTF-8", "yes");

            filterContext.Result = new ContentResult
            {                    
                ContentType = "text/xml",
                Content = xmlDecl.OuterXml + data.ToString(),
                ContentEncoding = UTF8
            };
        }
    }
}

Итак, закомментированный фрагмент - это код, который я нашел - посмотрите ссылки на stackoverflow, где я его получил:)

Я переопределил метод ToString () на всех своих бизнес-объектах, чтобы вернуть строку, представляющую, как бизнес-объект хотел бы представить себя в виде xml. WCF выполняет это с помощью атрибутов, но я хотел более чистое решение, которое не основывалось на рефлексии. И я не хотел иметь и проект веб-сайта, и проект WCF - проблема с двумя проектами заключалась в том, что было трудно сохранить их оба синхронно с функциональностью - я получаю запросы типа «почему сервис не позволяет мне фильтровать результаты, как на сайте?»

Меня очень интересуют отзывы других об этом подходе:)

Вот пример бизнес-объекта:

public class ContentFile : Entity
{
    public ContentBook BelongsToBook { get; set; }
    public string FileName { get; set; }
    public XElement FileXml { get; set; }
    public Binary FileData { get; set; }
    public List<ContentFile> Versions { get; set; }
    public List<ContentNode> ContentNodes { get; set; }

    public override string ToString()
    {
        return this.ToString(SaveOptions.DisableFormatting);
    }

    public string ToString(SaveOptions options)
    {
        XElement xml = XElement.Parse("<contentFile id=\"" + Id.ToString() + "" + "\" />");
        xml.Add(new XElement("fileName", FileName));
        xml.Add(new XElement("fileStructure", FileXml));
        xml.Add(base.ToString(options));
        return xml.ToString(options);
    }
}
2 голосов
/ 01 апреля 2010

Вы можете использовать OData для своего приложения MVC для обработки вещей типа Xml / Json. Я знаю, что другие люди предложили сделать свой собственный ролик - и это то, чем я сейчас занимаюсь ... используя мой собственный ActionFilter или собственный ViewResult.

Пример кода OData: Сообщение в блоге OData Скотта Хансельмана + сообщение StackOverflow .

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