none
configuration WCF avec un client Silverlight 5

    Discussion générale

  • Bonjour,

    j'ai une application silverlight 5 avec un web service WCF (Framework 4.5)

    j'attaque une base sql server 2005 avec un ADO.Net entity framework. le binding est basicHttpBinding

    Pool d'application "ASP.Net 4.0" mode pipeline intégrer

    j'ai un problème de désérialisation du message XML au niveau client. c'est un bug qui arrive seulement en situation de production (Windows server 2008R2)

    message d'erreur:

    " Le module de formatage a généré une exception en tentant de désérialiser le message : Une erreur s'est produite en tentant de désérialiser le paramètre http://tempuri.org/:EnTeteCommande_SearchResult. Le message InnerException était « Une erreur s'est produite lors de la désérialisation de l'objet de type System.Collections.ObjectModel.ObservableCollection`1[[PlanipeSil.ServiceReference.EnTeteCommande, PlanipeSil, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. La balise de début 'a:MATousSaufeille' sur la ligne 1 position 64853 ne correspond pas à la balise de fin de 'a:EnTeteCommande'. ligne 1, position 68714. »."

    le web.config  WCF:

     <system.webServer>
        <handlers>
          <add name="ServiceHandler" verb="*" path="*.svc" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
        </handlers>
      </system.webServer>
      <system.serviceModel>   
        <bindings>
          <basicHttpBinding>
            <binding name="SecurityBinding" 
                     closeTimeout="01:00:00" 
                     openTimeout="01:00:00"
                     receiveTimeout="01:00:00" 
                     sendTimeout="01:00:00" 
                     maxBufferPoolSize="2147483647"
                     maxBufferSize="2147483647" 
                     maxReceivedMessageSize="2147483647">
              <readerQuotas maxDepth="200" maxStringContentLength="2147483647"
                maxArrayLength="16384" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
              <security mode="None">
                <!--<transport clientCredentialType="Ntlm" />-->
              </security>
            </binding>
            <binding name="HttpStreaming" maxReceivedMessageSize="2147483647" transferMode="Streamed" />
          </basicHttpBinding>
          <customBinding>
            <binding name="customBinding7">
              <binaryMessageEncoding maxReadPoolSize="200" maxWritePoolSize="200" />
              <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
            </binding>
          </customBinding>
        </bindings>
        <services>
          <service behaviorConfiguration="WcfPlanipe.ServiceRefBehavior" name="WcfPlanipe.ServiceRef">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SecurityBinding" contract="WcfPlanipe.IServiceRef">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
              <!--<timeouts closeTimeout="00:01:00" />-->
              <timeouts closeTimeout="01:00:00" />
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="WcfPlanipe.ServiceRefBehavior">
              <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
              <serviceMetadata httpGetEnabled="false"/>
              <serviceDebug includeExceptionDetailInFaults="false"/>
              <serviceThrottling maxConcurrentCalls="200" 
                                 maxConcurrentInstances="200"
                                 maxConcurrentSessions="200"/>         
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>

    le config coté client (servicereference.config)

    <configuration>
        <system.serviceModel >       
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IServiceRef" closeTimeout="01:00:00" 
                             openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00"
                             maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
                        <security mode="None" />
                    </binding>
                </basicHttpBinding>
              <customBinding>
                <binding name="customBinding7">
                  <binaryMessageEncoding />
                  <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
              </customBinding>
            </bindings>
          <client>
            <endpoint address="http://localhost:6491/ServiceRef.svc" binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_IServiceRef" contract="ServiceReference.IServiceRef"
              name="BasicHttpBinding_IServiceRef" />
          </client>
          
        </system.serviceModel>
    </configuration>
    


    Cordialement

    mercredi 13 février 2013 10:31

Toutes les réponses

  • Bonjour,

    peut-être une erreur du à la taille du message trop long. Peux-tu essayer d'augmenter la valeur de l'attribut "maxArrayLength" dans ton "SecurityBinding" ?

    Tu peux également te servir d'un outil comme Fiddler pour voir exactement les données renvoyées par ton service.

    mercredi 13 février 2013 10:47
  • j'ai mis  maxArrayLength="900000"

    j'ai utilisé Fiddler pour tracer les requêtes client mais sans résultat.

    le problème se passe au niveau serveur (sur le web service)

    si quelqu'un à une autre idée, ou si vous avez besoin de plus d'informations, parce que moi je sèche.

    merci pour votre aide.


    Cordialement

    mercredi 13 février 2013 15:49
  • Bonjour
    Inner Exception nous indique un problème de XML

    La balise de début 'a:MATousSaufeille' sur la ligne 1 position 64853 ne correspond pas à la balise de fin de 'a:EnTeteCommande'. ligne 1, position 68714.

    Ça peut arriver à cause d’une troncation de message ou bien tout simplement d’un formatage mauvais de la réponse.
    Utiliser Fiddler pour voir si la réponse est bien formatée XML.
    Cordialement,  


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 15 février 2013 12:48
    Propriétaire
  • Bonjour,

    Nous changeons le type de votre question à « Discussion générale ». Si vous avez plus de temps pour réexaminer la question et fournir plus d'informations, n'hésitez pas à modifier le type du thread à « Question ». Si le problème est résolu, s’il vous plaît partagez la solution avec nous afin que la réponse puisse être trouvée et utilisée par d'autres membres de la communauté ayant des questions similaires.

    Merci !

    Cordialement

    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 19 février 2013 13:54
    Propriétaire
  • désolé,

    j'ai été occuper par autre chose. cela dis, Fiddler ne m'apprend rien de particulier ou alors je l'utilise mal.

    j'ai finalement, fait appel aux service de Microsoft pour résoudre mon problème.

    je posterai la solution une fois résolut.

    Merci pour votre aide.


    Cordialement

    lundi 25 février 2013 18:34
  • Bonjour,

    encore une fois mes excuses.

    j'ai ajouté la balise suivante:

    <system.web>
       <httpRuntime maxRequestLength="2480"/>
    </system.web>

    comme l'appli transporte des objets complexes et gros j'ai augmenté la longueur de la requête http.

    Cordialement.


    Cordialement

    mardi 9 avril 2013 15:33
  • Bonjour,

    je me permets d'intervenir sur cette discussion plus d'un mois plus tard.

    Je ne comprends pas en quoi l'ajout de la balise httpRuntime avec l'attribut maxRequestLength fixé à 2480 a pu solutionner votre problème.

    En effet comme l'indique la documentation, la valeur par défaut est 4096KB. Par conséquent en fixant la valeur à 2480, vous n'avez pas augmenté la valeur, vous l'avez diminué.

    De plus, à ma connaissance l'utilisation de cette attribut est utile dans le cas d'un FileUpload.

    Sauf erreur de ma part, cela signifie que votre problème était ailleurs.

    mercredi 22 mai 2013 13:37
  • Bonjour,

    j'ai encore augmenté la valeur à 50M

     <httpRuntime maxRequestLength="51200"/>

    l'erreur se produit lors de l'envoi de la donnée du client vers le serveur. De plus, le réseau du client n'est pas très performant (coupure intempestive).

    Cela dit, j'ai aussi modifié le fonctionnement de l'application, plus d'envoi de gros volume de données du client vers le serveur.


    Cordialement

    jeudi 20 juin 2013 13:42
  • Comme je le disais dans mon message précédent, je pense que l'utilisation de la propriété maxRequestLength  n'est pas adapté dans ce cas.

    J'ai utilisé l'encodage MTOM pour envoyer des données conséquentes. J'avais lu cet article "Large Data and Streaming" que tu trouveras facilement sur MSDN.

    Ce n'est pas normal que vous fixiez à 2147483647 les propriétés de l'élément Binding par exemple, à moins que vos données soit de l'ordre du To. Je suppose que vous avez fait une étude préalable et que vous connaissez la taille maximale des données qui peuvent passer.

    Il faut également faire attention  aux propriétés de type timeout.

    De plus basicHttpBinding s'utilise plus pour de l'ASMX d'après la documentation. Dans ce cas j'utiliserais plutôt wsHttpBinding.

    Pour ma part, les propriétés importantes dans votre cas sont côté serveur et ce sont les suivantes :

    • receiveTimeout
    • maxReceiveMessageSize
    • maxArrayLength

    Voici un exemple de configuration que j'avais fait pour passer des données de 400 Mo.

    serveur

    <bindings>
          <wsHttpBinding>
            <binding name="WSHttpBinding_IPicturesService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="409600"
                messageEncoding="Mtom" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
              <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="409600"
                  maxBytesPerRead="4096" maxNameTableCharCount="16384" />
              <reliableSession ordered="true" inactivityTimeout="00:10:00"
                  enabled="false" />
              <security mode="Message">
                <transport clientCredentialType="Windows" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="Windows" negotiateServiceCredential="true"
                    algorithmSuite="Default" />
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>

    client

    <bindings>
                <wsHttpBinding>
                    <binding name="WSHttpBinding_IPicturesService" closeTimeout="00:01:00"
                        openTimeout="00:00:30" receiveTimeout="00:10:00" sendTimeout="00:10:00"
                        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                        maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                        messageEncoding="Mtom" textEncoding="utf-8" useDefaultWebProxy="true"
                        allowCookies="false">
                        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        <reliableSession ordered="true" inactivityTimeout="00:10:00"
                            enabled="false" />
                        <security mode="Message">
                            <transport clientCredentialType="Windows" proxyCredentialType="None"
                                realm="" />
                            <message clientCredentialType="Windows" negotiateServiceCredential="true"
                                algorithmSuite="Default" />
                        </security>
                    </binding>
                </wsHttpBinding>
            </bindings>

    Pour le transfert, j'utilise une classe qui a une propriété de type byte[].

    En espérant vous avoir aidez.

    mardi 20 août 2013 12:36