0

J'ai un service WCF qui a hébergé dans Windows ServicesSilverLight Connectez-vous à NetTcp WCF hébergé inWindows service

Il utilise NetTcpBinding et je pouvais connecter, je veux mettre en œuvre nouveau client Silverlight pour accéder au service

i ont marcher à travers la voie normale d'ajouter une référence de service, et il a été ajouté avec vide « ServiceReferences.ClientConfig »

donc j'ai vu des discussions et des sujets, j'ai enfin écrire ma configuration manuellement pour le service

lorsque j'essaie de me connecter montrez cette exception Impossible de se connecter à net.tcp: // localhost: 4502/MyService/Service. La tentative de connexion a duré pendant une durée de 00: 00: 02.2111265. Code d'erreur TCP 10013: tentative d'accès à un socket d'une manière interdite par ses autorisations d'accès. Cela peut être dû à une tentative d'accès à un service interdomaine alors que le service n'est pas configuré pour l'accès interdomaine. . Vous devrez peut-être contacter le propriétaire du service pour exposer une stratégie de domaine inter-socket sur HTTP et héberger le service dans la plage de ports de socket autorisée 4502-4534.

Je crois que le problème lié à clientaccesspolicy.xml fichier

après la recherche des gens que je dis besoin d'avoir IIS7 installé et le fichier est accessible à travers elle, je l'ai essayé, mais je ne pouvais pas le faire fonctionner

mais j'ai travaillé auparavant, mais j'utilisais PollinghttpBinding pas NetTcp, et je l'ai créé un autre contrat de service pour retourner le fichier ClientAccessPolicy

j'ai essayé de faire la même chose que je fais avant avec PollinghttpBinding mais je peux n'écris pas la bonne configuration du service

Mon client refuse d'utiliser IIS, alors pourrais-je utiliser cette méthode et quelle est la bonne configuration que je devrais utiliser avec ce service?

Voici la configuration que j'utilise pour mon service

<service behaviorConfiguration="serviceBehavior" name="MyService"> 
       <endpoint address="net.tcp://localhost:4502/MyService/Service"  behaviorConfiguration="endpointBehavior" binding="netTcpBinding"   bindingConfiguration="netTcpServiceBinding" contract="IMyService"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
       <endpoint address="net.tcp://localhost:7000/MyService/mex"  binding="mexTcpBinding" contract="IMetadataExchange"/> 
      </service> 

quelqu'un peut-il donner de l'aide?

Répondre

0

Les liaisons Net.tcp ne sont pas prises en charge «out-of-the-box» dans Silverlight. C'est pourquoi la config est vide. Mais vous pouvez l'utiliser quand même, en utilisant un customBinding et en définissant les propriétés dont vous avez besoin. Cependant, je n'ai jamais essayé ce fyself.

S'il s'agit d'un problème de domaine croisé, il est nécessaire de le relier au fichier ClientAccessPolicy.xml. Normalement (comme indiqué de nombreux endroits sur différents forums), cela est résolu en mettant le fichier à la racine du site. Donc, si votre service s'exécute sur "http: // localhost/MyService", le fichier doit être placé de manière à être disponible dans "http: // lovalhost". Cependant, sans IIS disponible, cela doit être fait d'une autre manière. Vous devrez créer manuellement un point de terminaison sur la racine dans le service Windows, où ce fichier est disponible. Il s'agit d'une liaison BasicHttp normale que vous utilisez "net.tcp" ou "http".

Je l'ai fait avec succès de cette façon:

interface politique:

using System; 
using System.IO; 
using System.ServiceModel; 
using System.ServiceModel.Web; 

namespace MyPolicyService 
{ 
    [ServiceContract] 
    public interface IPolicyRetriever 
    { 
     [OperationContract] 
     Stream GetPolicy(); 
    } 
} 

classe politique:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.ServiceModel.Web; 

namespace MyPolicyService 
{ 
    public class PolicyRetrieverBase : IPolicyRetriever 
    { 
     public Stream StringToStream(String result) 
     { 
      WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml"; 
      return new MemoryStream(Encoding.UTF8.GetBytes(result)); 
     } 

     public Stream GetSilverlightPolicy() 
     { 
      string result = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<access-policy> 
    <cross-domain-access> 
     <policy> 
      <allow-from http-request-headers=""*"" http-methods=""*""> 
       <domain uri=""*""/> 
      </allow-from> 
      <grant-to> 
       <resource path=""/"" include-subpaths=""true""/> 
      </grant-to> 
     </policy> 
    </cross-domain-access> 
</access-policy>"; 

      return StringToStream(result); 
     } 

     public Stream GetFlashPolicy() 
     { 
      string result = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd""> 
<cross-domain-policy> 
    <site-control permitted-cross-domain-policies=""all""/> 
    <allow-access-from domain=""*"" secure=""false"" /> 
    <allow-http-request-headers-from domain=""*"" headers=""*"" secure=""false"" /> 
</cross-domain-policy>"; 

      return StringToStream(result); 
     } 
    } 
} 

Lorsque ces classes sont créées, créer le service presque comme si vous démarrez le service "net.tcp", mais bien sûr le changer pour BasicHttpBinding et utilise des comportements différents et des valeurs de propriétés liées à BasicHttpBinding (comme TransferMode = Buffered etc).

Ce service de politique devrait, bien entendu, être démarré sur la racine du site (http: // localhost). ID Vous avez le IIS en cours d'exécution sur ce serveur, ne commencez pas à ce service de la politique parce que cela prendra plus de cette adresse :-)

Espoir qui vous fait bouger dans le bon sens-ish :-)

Questions connexes