2010-06-07 2 views
0

J'essaie fondamentalement de reproduire l'exemple Socket à partir d'ici: http://www.silverlightshow.net/items/Sockets-and-their-implementation-in-SL2-Beta-1-including-a-chat-like-example.aspx J'ai seulement fait un petit changement côté client , c'est-à-diresilverlight Socket: Erreur non gérée dans l'application Silverlight Une tentative d'accès à une socket a été faite d'une manière interdite par ses autorisations d'accès

String safeHost = "127.0.0.1"; 
      int port = 4509; 

Puis-je avoir cette erreur de permission? Une idée pourquoi?

Erreur non gérée dans l'application Silverlight Une tentative d'accès à une socket a été effectuée d'une manière interdite par ses autorisations d'accès.

Répondre

3

Je crois que la façon dont les contrôles de sécurité de socket fonctionnent vous devez utiliser la même chaîne d'URL que votre application utilise. pour vous assurer que je suis en utilisant la chaîne correcte je l'ai toujours utilisé cela pour construire mon DNSEndPoint:

int Port = 4509; 
DnsEndPoint ep = new DnsEndPoint(Application.Current.Host.Source.DnsSafeHost, Port, AddressFamily.InterNetwork); 
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
sock.NoDelay = true; 
SocketAsyncEventArgs ea = new SocketAsyncEventArgs{RemoteEndPoint = ep}; 
//set up completed event handler et al. 
sock.ConnectAsync(ea); 

J'ai utilisé ce code exact dans une application de chat similaire. En utilisant la propriété Application.Current.Host.Source.DnsSafeHost vous vous assurez que vous utilisez le même nom Dns pour accéder au serveur avec le socket que le navigateur utilise pour HttpRequests.

Également vous desservez le fichier de stratégie d'accès sur le port 943, ceci est une autre exigence du support de socket dans Silverlight.

EDIT

confirmer que vous hébergez le fichier de stratégie que vous pouvez faire un certain nombre de choses.

  1. installer Fiddler, vous pouvez l'utiliser pour déboguer tout le trafic http frapper votre serveur, vous devriez être en mesure de voir la demande de fichier de stratégie.
  2. Servir votre fichier de stratégie de manière dynamique et puis définir un point d'arrêt dans votre application serveur pour confirmer qu'il est servi. c'est ce que j'ai fait.

ici le code que je servais le fichier de stratégie:

public abstract class Server 
{ 
    protected Socket Listener { get; set; } 
    protected int Port { get; private set; } 
    protected int Backlog { get; private set; } 
    protected bool isStopped { get; set; } 
    protected SocketAsyncEventArgs AcceptArgs {get;set;} 

    public Server(int port) 
    { 
     AcceptArgs = new SocketAsyncEventArgs(); 
     AcceptArgs.Completed += new EventHandler<SocketAsyncEventArgs>(Accept_Completed); 
     isStopped = true; 
     Port = port; 
     Backlog = 100; 
    } 


    public Server(int port, int backlog) 
    { 
     isStopped = true; 
     Port = port; 
     Backlog = backlog; 
    } 

    public void Start() 
    { 
     isStopped = false; 

     Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     IPEndPoint ep = new IPEndPoint(IPAddress.Any, Port); 
     Listener.ExclusiveAddressUse = true; 
     Listener.Bind(ep); 
     //Console.WriteLine("Listening on " + Port); 
     Listener.Listen(Backlog); 

     Listener.AcceptAsync(AcceptArgs); 
    } 

    void Accept_Completed(object sender, SocketAsyncEventArgs e) 
    { 
     if (isStopped) return; 
     Socket client = e.AcceptSocket; 
     //Console.WriteLine("Accepted Connection From: " + client.RemoteEndPoint.ToString()); 
     e.AcceptSocket = null; 
     Listener.AcceptAsync(AcceptArgs); 
     HandleClient(client); 
    } 

    public virtual void Stop() 
    { 
     if (isStopped) throw new InvalidOperationException("Server already Stopped!"); 
     isStopped = true; 
     try 
     { 
      Listener.Shutdown(SocketShutdown.Both); 
      Listener.Close(); 
     } 
     catch (Exception) 
     { 
     } 
    } 

    protected abstract void HandleClient(Socket Client); 
} 
public class PolicyServer : Server 
{ 
    public const String policyStr = @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
             <access-policy> 
              <cross-domain-access> 
               <policy> 
                <allow-from> 
                 <domain uri=""*"" /> 
                </allow-from> 
                <grant-to> 
                 <socket-resource port=""4530"" protocol=""tcp"" /> 
                </grant-to> 
               </policy> 
              </cross-domain-access> 
             </access-policy>"; 
    private byte[] policy = Encoding.ASCII.GetBytes(policyStr); 
    private static string policyRequestString = "<policy-file-request/>"; 

    public PolicyServer(): base(943) 
    { 
    } 

    protected override void HandleClient(Socket socket) 
    { 
     TcpClient client = new TcpClient { Client = socket }; 
     Stream s = client.GetStream(); 
     byte[] buffer = new byte[policyRequestString.Length]; 
     client.ReceiveTimeout = 5000; 
     s.Read(buffer, 0, buffer.Length);//read in the request string, but don't do anything with it 
                //you could confirm that it is equal to the policyRequestString 
     s.Write(policy, 0, policy.Length); 
     s.Flush(); 

     socket.Shutdown(SocketShutdown.Both); 
     socket.Close(1); 
     client.Close(); 
    } 
} 

ensuite l'utiliser: dans le même processus

PolicyServer ps = new PolicyServer(); 
ps.Start(); 
//then when shutting down 
ps.Stop(); 

J'ai accompagné ce « serveur » qui a été en cours d'exécution le reste du composant Chat Server. Définissez un point d'arrêt dans HandleClient pour confirmer s'il reçoit la demande.

+0

Mon code est exactement le même que le vôtre, mais me donne toujours la même erreur. J'ai créé manuellement un clientaccesspolicy.xml et mis dans le dossier IIS par défaut, de sorte qu'il est servi sous 80 port. Comment puis-je le déplacer sur le port 943? Créer un nouveau site? – Yang

+0

[Modifier] J'ai créé un site avec le port 943 et y ai déplacé le fichier de politique. Cela ne fonctionne toujours pas ... – Yang

+0

pouvez-vous confirmer que le client reçoit avec succès le fichier de stratégie à l'aide d'un débogueur réseau? – luke

Questions connexes