2009-06-01 5 views
2

Je souhaite créer un service Web pour mes clients afin qu'ils puissent afficher leurs données sur leurs propres sites Web. Puisque je ne sais pas quelle plate-forme chaque client exécute, quelle serait la meilleure solution pour créer un proxy au service WCF qui peut être utilisé par tous les navigateurs? De plus, je ne suis pas sûr de la façon dont je devrais présenter les données. Supposons que mes utilisateurs n'ont aucune compétence en développement. Je vais, par une autre interface, donner à l'utilisateur la possibilité de télécharger le code nécessaire pour créer la requête, puis traiter la réponse. Serait-il préférable d'analyser une réponse xml du côté client, puis de créer la liste des données ou d'avoir la liste déjà formatée (dans une chaîne) et que le client fasse un document.write? J'ai examiné quelques solutions, mais elles semblent nécessiter l'utilisation d'une page ASP avec un gestionnaire de scripts. Comme je l'ai dit, je voudrais quelque chose de suffisamment générique pour utiliser différents navigateurs. Principalement IE et FireFox.Consommez WCF avec JavaScript, mais gardez-le assez générique pour tous les clients?

Daniel

Répondre

4

Tout d'abord, puisque vous ne voulez pas dépendre de Microsoft Ajax ScriptManager, ne pas utiliser < enableWebScript/> dans le endpointBehaviors/comportement. C'est JSON spécifique à Microsoft. Cependant, heureusement, WCF permet très facilement à votre client de décider s'il veut XML ou JSON générique.

  1. Utilisez le < webHttp/> comportement.

    <endpointBehaviors>
    nom du comportement < = "My.WcfServices.webHttpBehavior" >
    < webHttp/>
    </comportement >
    </endpointBehaviors >

  2. Créez un attribut de propriété WebServiceHost personnalisé et personnalisé comme décrit dans Damian Mehers' blog, WCF REST Services. Dans le code de Mehers, le type est déterminé par le type de contenu de la requête. Vous pouvez l'étendre pour examiner l'URL, par exemple, .xml ou .json ou? Format = xml | json. Dans la méthode SerializeReply, examinez l'URL.

    Demande de message = OperationContext.Current.RequestContext.RequestMessage;
    Uri url = request.Properties ["OriginalHttpRequestUri"] comme Uri;
    // Examiner la chaîne de requête au format
    System.Collections.Specialized.NameValueCollection colQuery = System.Web.HttpUtility.ParseQueryString (url.Query);
    chaîne strResponseFormat = colQuery ["format"];
    // ou examinez l'extension
    string strResponseFormat = url.LocalPath.Contains (".json")?"json": "xml";

  3. Définir votre méthode (s)

    [OperationContract]
    [WebGet (UriTemplate = "Bonjour. {} ResponseFormat")] // ou "Bonjour? Format = {} ResponseFormat"
    [ DynamicResponseType]
    chaîne publique Bonjour (chaîne responseFormat)
    {
    return "Hello World";
    }

URL Exemple:
http://localhost/myrest.svc/Hello.xml
http://localhost/myrest.svc/Hello.json
ou
http://localhost/myrest.svc/Hello?format=xml
http://localhost/myrest.svc/Hello?format=json

  1. Les deux JSON et XML sont faciles à consommer à travers les navigateurs . Les bibliothèques, telles que jQuery pour JSON et Sarissa pour XML, rendent la tâche encore plus facile.

REMARQUE: Si vous voyez une erreur « Impossible de trouver une adresse de base qui correspond à système http pour le point final avec une liaison WebHttpBinding. », Ajoutez les baseAddressPrefixFilters élément et ajoutez localhost (ou quel que soit votre domaine) pour hôte IIS Noms d'en-tête.

<system.serviceModel> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
    <baseAddressPrefixFilters> 
     <add prefix="http://localhost"/> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 
+0

Maintenant, cela vient juste de ROCKS !!!! C'est le meilleur article que j'ai vu sur ce sujet !!!! – DDiVita

Questions connexes