2009-09-03 11 views
3

J'ai une application Silverlight sur le client qui communique avec le serveur via WCF. Je reçois de temps en temps une CommunicationException - et en particulier lorsque je passe de plus grandes quantités de données à certains paramètres du service. On m'a dit que si je veux que l'application Silverlight communique avec un serveur comme celui-ci, j'ai besoin d'un fichier clientaccesspolicy.xml - pour éviter les scripts intersites.Où placer clientaccesspolicy.xml dans le projet Silverlight

Alors - j'ai créé la valeur par défaut clientaccesspolicy.xml comme ceci:

<?xml version="1.0" encoding="utf-8" ?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-request-headers="*"> 
     <domain uri="*"/> 
     </allow-from> 
     <grant-to> 
     <resource path="/" include-subpaths="true"/> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 

Mais maintenant, je ne sais pas où le mettre. Et dois-je dire à qui que ce soit? Et - pourrait-il être la solution à mes problèmes?

+0

Espérons que la deuxième édition apportera plus de lumière sur la situation – Johannes

Répondre

6

Oui, vous avez besoin d'un clientaccesspolicy.xml lorsque vous souhaitez que Silverlight communique avec une source externe.

Vous n'avez pas spécifié si le service WCF est hébergé en tant que service, auto-hébergé ou hébergé dans IIS. Si c'est dans IIS, le fichier est placé à la racine du dossier partagé (site Web).

Si le service est auto-hébergé, alors vous pouvez lire ceci article.

Pour un service Windows, vous pouvez vous référer à ce qui suit article

Mais si vous obtenez seulement l'erreur de temps en temps, alors il est probablement pas votre plus gros problème. En regardant le fait que vous dites que les erreurs se produisent lorsque vous essayez d'envoyer de gros paramètres, cela signifie que vous devrez regarder les liaisons du service WCF et le client. Ces limites sont normalement quelque chose comme 16kb par appel. Cela peut être fait du côté du service, en créant une liaison qui permettra de transmettre de grandes quantités de données.

<basicHttpBinding> 
     <binding name="NewBinding0" maxBufferSize="104857600" maxReceivedMessageSize="104857600"> 
      <readerQuotas maxDepth="104857600" maxStringContentLength="104857600" 
      maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600" /> 
     </binding> 
     </basicHttpBinding> 

puis de l'associer à un point de terminaison.

Si vous regardez dans votre fichier ServiceReferences.ClienConfig du côté client, vous devriez voir une liaison à un service WCF.

Vous pouvez le modifier pour ressembler à:

<binding name="ProductConfig" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
        <security mode="None" /> 
       </binding> 

EDIT: Voici comment ajouter la liaison sur le côté serveur.

  • Faites un clic droit sur web.config et dire « modifier la configuration de WCF »
  • A droite, il y a un élément d'arbre « bindings »
  • Faites un clic droit sur ce point et dire « Ajouter nouvelle liaison »
  • Nommez la liaison et définissez tous les éléments Max * sur un nombre arbitrairement grand.
  • Associez cette liaison à vos points de terminaison en développant vos services et en sélectionnant le point de terminaison que vous utilisez. Au BindingConfiguration, sélectionnez votre nouvelle liaison.

Vous pouvez également ajouter ceci manuellement à votre site Web.fichier de configuration, en trouvant l'élément

<system.serviceModel> 

Il devrait y avoir un élément enfant <bindings> quelque part là-dedans. Vous pouvez ajouter la liaison comme indiqué ci-dessus. Et puis faites défiler jusqu'à l'endroit où vos points de terminaison sont affichés et ajoutez une balise bindingConfiguration = "NewBinding0" dans le fichier XML.

EDIT Prenez 2:

Bon, bien sûr, voici un exemple de ce qu'il ressemble à un de mes projets:

<system.serviceModel> 

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    <extensions> 

    </extensions> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="NewBinding0" maxBufferSize="104857600" maxReceivedMessageSize="104857600"> 
      <readerQuotas maxDepth="104857600" maxStringContentLength="104857600" 
      maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600" /> 
     </binding> 
     </basicHttpBinding> 
     <mexHttpBinding> 
     <binding name="NewBinding1" /> 
     </mexHttpBinding> 
    </bindings> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="policyBehavior"> 
      <webHttp /> 
     </behavior> 
     <behavior name="NewBehavior" /> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="NewBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="NewBehavior" name="ALMWCFHost.ServiceModel"> 
     <clear /> 
     <endpoint address="GuildService" binding="basicHttpBinding" bindingConfiguration="NewBinding0" 
      name="ProductConfig" contract="ALMWCFHost.IProductConfigModel"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://omrsrv004/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    </system.serviceModel> 

si vous avez plus de problèmes avec cela, s'il vous plaît Fournissez des détails sur l'IDE que vous utilisez, et comment avez-vous ajouté vos points de terminaison de service à l'origine.

+0

Merci pour une bonne réponse! Vous avez probablement raison à propos de mon problème étant une limite de la taille des paramètres. Je suis nouveau sur ces sujets, donc je n'étais pas au courant à ce sujet. Les paramètres du côté client sont comme vous le suggérez déjà, mais je ne suis pas sur où ajouter la liaison côté serveur. Le seul endroit où je vois quel type d'apparence est Web.config, mais je ne comprends pas vraiment ce qu'il faut faire ici .. – stiank81

+0

Encore une fois, mais je suis désolé - je ne reçois pas de "modifier WCF config" quand droit- en cliquant sur web.config. Et en le faisant manuellement, je trouve le , mais je ne trouve pas un enfant . Il ne vous arriverait pas d'avoir un exemple de fichier xml pour que je puisse créer ce dont j'ai besoin moi-même ... – stiank81

+0

L'ajout de NewBinding0 et la définition de bindConfiguration pour mon point de terminaison de service l'ont résolu. Merci beaucoup pour votre attention! – stiank81

Questions connexes