Подтвердить что ты не робот

ASP.NET MVC и WCF

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Это должно быть:

Клиент Windows → Сервисы

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

Ответ 2

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

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

Ответ 3

Я использую asp.net mvc как для моего html-сайта (механизм просмотра по умолчанию), так и для моей конечной точки обслуживания. Конечная точка службы используется моими клиентами WPF и Silverlight, введя "content-type = text/xml" в заголовок запроса WebClient (см. ScottGu post по потреблению услуги в 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);
    }
}

Ответ 4

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

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