WCF 3.5 Service REST fonctionne avec XML, mais pas JSON format de réponse

voix
2

J'ai un contrat de service avec plusieurs contrats d'exploitation définis. J'ai ajouté un nouveau point de terminaison pour exposer mes opérations comme webservice reposant. De plus, je l'ai mis à jour des définitions de fonctionnement afin qu'ils puissent être appelés d'une manière RESTful

    [OperationContract]
    [WebInvoke(
    Method = GET,
    ResponseFormat = WebMessageFormat.Xml,
    BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = product/getall)]   
    Product[] GetAll()

Tout fonctionne très bien mes produits sont retournés en XML ... mais je voudrais utiliser JSON à la place. Si je change le code

[OperationContract]
[WebInvoke(
Method = GET,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = product/getall)]   
Product[] GetAll()

Réponse à l'appel produit / getall est vide. Aucune exception est levée, mais j'ai un mauvais sentiment que la mise en œuvre WCF JSON peut en quelque sorte pas faire face à la sérialisation. Tout le monde avait le même problème? Aucune suggestion? Est-il possible d'utiliser JSON.NET sérialiser / désérialiser mes objets?

Créé 17/08/2010 à 17:07
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

J'ai pu obtenir ce travail - voici ce que je l'ai fait. Tout d'abord, mon environnement est VS2010 et j'utilise le serveur Web VS (Cassini).

Je n'ai pas changé votre signature de la méthode ou votre WebInvokeattribut. Le corps de la GetAll()méthode est la suivante:

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "product/getall")]
Product[] GetAll()
{
    Product[] prods = new Product[3] {
        new Product() { Name="Foo", Desc="Bar"},
        new Product() {Name="Ha", Desc="Ho"},
        new Product() {Name="Who", Desc="What"}
    };

    return prods;
}

Le web.config ressemble à ceci:

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="WebApplication2.ProdServiceAspNetAjaxBehavior">
              <webHttp />
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
        multipleSiteBindingsEnabled="true" />
    <services>
        <service name="WebApplication2.ProdService">
            <endpoint address="" behaviorConfiguration="WebApplication2.ProdServiceAspNetAjaxBehavior"
                binding="webHttpBinding" contract="WebApplication2.ProdService" />
        </service>
    </services>
</system.serviceModel>

Honnêtement, la plupart de ce défaut les out-of-the-box fonctionnalité. La seule chose que je changé changeait le endpointBehaviorà utiliser au webHttplieu de la valeur par défaut enableWebScript. A part cela, il a bien fonctionné.

EDIT (oublié la classe Product) : Voici la classe Product - je décore avec DataContractet DataMemberattributs:

[DataContract]
public class Product
{
    [DataMember()]
    public String Name { get; set; }
    [DataMember()]
    public String Desc { get; set; }
}

Ce fut ma sortie:

[{"Desc":"Bar","Name":"Foo"},{"Desc":"Ho","Name":"Ha"},{"Desc":"What","Name":"Who"}]

Je suppose que vous utilisez enableWebScriptdans votre web.config. Changez - le webHttpet voir ce qui se passe. Le enableWebScriptréglage est utilisé pour plusieurs types ASMX de compatibilité (je crois). Si vous retournez JSON (que beaucoup de mes méthodes de service GET ne), utilisez webHttp( ce qui est ce que je suis habitué à l' utilisation).

Faites-moi savoir ce que vous obtenez et je vais mettre à jour ma réponse en conséquence.

Créé 17/08/2010 à 17:54
source utilisateur

voix
1

Allumez le tracé de WCF et afficher le journal de trace. Cela devrait indiquer exactement où la question est. Vous pouvez configurer votre web.config avec les paramètres suivants pour activer le suivi.

<system.serviceModel>
  <diagnostics>
      <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
  </diagnostics>
</system.serviceModel>

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel" switchValue="Warning, ActivityTracing"
      propagateActivity="true">
      <listeners>
        <add type="System.Diagnostics.DefaultTraceListener" name="Default">
          <filter type="" />
        </add>
        <add name="ServiceModelTraceListener">
          <filter type="" />
        </add>
      </listeners>
    </source>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
      <listeners>
        <add type="System.Diagnostics.DefaultTraceListener" name="Default">
          <filter type="" />
        </add>
        <add name="ServiceModelMessageLoggingListener">
          <filter type="" />
        </add>
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add initializeData="C:\Web_tracelog.svclog"
      type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
      <filter type="" />
    </add>
    <add initializeData="C:\Web_messages.svclog"
      type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
      <filter type="" />
    </add>
  </sharedListeners>
</system.diagnostics>
Créé 17/08/2010 à 17:37
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more