27 votes

ASP.NET MVC et WCF

Je suis en train de travailler sur mon chemin MVC pour le moment, mais sur mon "Pour apprendre à un certain point" de la liste, j'ai aussi de la WCF.

Je me demande juste si WCF est quelque chose qui devrait/pourrait être utilisé dans une Application MVC ou pas? L'arrière-plan, c'est que je veux une Application de Bureau (.NET 3.5, WPF) d'interagir avec mon MVC Site Web, et je me demande quelle est la meilleure façon de transférer des données entre les deux est. Devrais-je utiliser des Vues spéciales/ont les contrôleurs de retour JSON ou XML (à l'aide de la ContentResult)?

Et peut-être même plus important, pour l'inverse, je ne pouvais appel spécial contrôleurs? Vous ne savez pas comment l'Autorisation de travailler dans un tel contexte. Je peux soit utiliser l'Authentification Windows ou (si le Site est en cours d'exécution de l'authentification de formulaires) demandez à l'utilisateur de stocker ses informations d'identification dans l'application, mais je serais alors en mesure de créer un Client HTTP dans mon Application. Ainsi, alors que MVC => Application semble très simple, l'Application => MVC ne semble pas être un peu délicat et une utilisation possible de la WCF?

Je n'essaie pas de la force brute de la WCF dans ce domaine, mais je me demande juste si il n'y a en effet un bon cas d'utilisation de WCF dans une application MVC.

47voto

jezell Points 2430

Services WCF peut avoir du sens dans cette situation, mais ne pas créer des services qui correspondent à votre INTERFACE utilisateur, créer des services qui s'harmonisent avec les processus d'affaires. c'est à dire. vous n'aurez pas un service qui retourne les données d'affichage de chaque page, vous avez un service qui expose des opérations logiques. Ensuite, votre site peut appeler les mêmes services que le client windows appels, mais vous n'avez pas de couple de la conception du client windows de la conception du site web.

Au lieu de cela:

Windows Client -> Services -> Site Web

Il devrait être:

Windows Client -> Services

Site Web -> Services

9voto

Vous pouvez utiliser ADO.NET Data Services pour partager vos données avec JSON (pour les clients JavaScript) ou XML (pour les applications de bureau).

ASP.NET MVC peut ensuite tirer parti de cela en utilisant l'un des deux dans le modèle. Comme vous le savez probablement, ADO.NET Data Services est basé sur WCF, vous étiez donc sur la bonne voie.

8voto

user139669 Points 81

J'utilise asp.net mvc comme mon site web html (affichage par défaut du moteur) et mon point de terminaison de service. Le point de terminaison de service est utilisé par mon WPF et Silverlight clients par injection "content-type=text/xml" dans l'en-tête d'une requête WebClient (voir ScottGu du post sur la consommation d'un service dans SL, qui a inspiré cette approche). J'ai trouvé quelque part sur le net, un peu de code qui remplace la OnActionExecuted événement comme celui-ci:

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
            };
        }
    }
}

Donc, le commentaire d'un élément est le code que j'ai trouvé à voir le stackoverflow liens de où je l'ai eu :)

J'ai changé la méthode ToString() sur l'ensemble de mon business objects pour revenir chaîne de caractères représentant la manière dont l'entreprise objet aimerais représenter lui-même comme du xml. WCF accomplit ceci grâce à des attributs, mais je voulais une solution de nettoyage qui ne repose pas sur la réflexion ET je ne voulais pas avoir à la fois un projet de site web et d'un projet WCF - le problème de la deux projets, c'est qu'il était difficile de les garder en synchronisation avec le respect de la fonctionnalité - je me demande, "pourquoi ne pas le service de me permettre de filtrer les résultats de ma recherche comme le site n'?"

Je suis très intéressé par d'autres commentaires sur cette approche :)

Voici un exemple d'un objet de l'entreprise:

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);
    }
}

2voto

Pure.Krome Points 28473

Vous pouvez utiliser OData pour votre application MVC pour gérer les trucs de type Xml / Json. Je sais que d'autres personnes ont suggéré de lancer le vôtre - et c'est ce que je fais actuellement .. via l'utilisation de mon propre ActionFilter personnalisé ou ViewResult personnalisé.

Exemple de code OData: article de blog OData + StackOverflow de Scott Hanselman .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X