2012-05-10 2 views
0

У меня есть клиент silverlight, используя SL4 и сервер C#, используя .NET 4. Сервер открывает порт на 4525, к которому предназначен клиент для подключения. Теперь, если я могу попросить, чтобы вы просто прочитали следующее, мы, вероятно, можем избежать необходимости отправлять любой дополнительный код:Почему мой файл политики Socket Silverlight не работает?

Клиент пытается установить соединение с сервером, открывает соединение для файла политики, запросы файл политики и получает файл политики. Что не происходит, это событие onConnect в клиенте. Прежде чем я включил сервер политик, клиент подключился бы на 4525 и выполнил бы событие onConnect, но сразу же потерпит неудачу, потому что не было сервера политики. Теперь, когда я реализовал сервер политики, кажется, что он никогда не обнаруживает завершение его доставки.

Вот резюме передачи:

Client: 
<policy-file-request/> 
Server: 
<?xml version="1.0" encoding ="utf-8"?> 
<access-policy> 
<cross-domain-access> 
<policy> 
<allow-from> 
<domain uri="*:4525" /> 
</allow-from> 
<grant-to> 
<socket-resource port="4525" protocol="tcp" /> 
</grant-to> 
</policy> 
</cross-domain-access> 
</access-policy> 

Эффективно; единственный вопрос, на который я пытаюсь ответить, заключается в следующем: я что-то упустил из своего файла политики или мне нужно каким-либо образом завершить его представление клиенту, чтобы мой клиент обнаружил его доставку?

Things of note: 
    The Client successfully establishes its connection to the policy server 
    The policy server successfully writes the policy back to the client 
    The 'real' servers port is successfully opened 
    The client 'can' connect to the 'real' server 

Спасибо вам всем за ваше время, я уверен, что кто-то сможет вам помочь.

Код запрос Client Connection

Не уверен, что это какие-либо дальнейших последствий в стороне найти ответ; но:

private static DnsEndPoint IP_END_POINT = new DnsEndPoint("192.168.0.36", 4525, AddressFamily.InterNetwork); 


public MainPage() 
{ 
    try 
    { 
     InitializeComponent(); 

     socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     SocketAsyncEventArgs connectEventArgs = new SocketAsyncEventArgs(); 
     connectEventArgs.RemoteEndPoint = IP_END_POINT; 
     connectEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(ConnectionEstablished); 
     socket.ConnectAsync(connectEventArgs); 
    } 
    catch (Exception e) 
    { 
    } 
} 

Новостройка'Соединение установлено' пожары!

Получается, что если я хочу минуту или около того, мое событие ConnectionEstablished в конечном итоге срабатывает. Однако то, что я получаю от этого, не настолько обнадеживает.

В итоге у меня возникла проблема с SocketError 'AccessDenied' и сообщение «Попытка получить доступ к сокету запрещена правами доступа». Как и следовало ожидать, мой сервер никогда не принимает подключение. Я знаю, что сервер имеет открытый порт и может принимать соединение, поэтому это довольно запутанный сценарий.

Еще раз спасибо за помощь.

+0

Трудно сказать, не зная, какую систему вы используете для подключения приложения Silverlight к серверу. – Trisped

+0

Что значит «система»? Я работаю в среде Windows 7, клиенте и сервере. Chrome работает с клиентом. Сервер открывает TcpListener как для сервера политик, так и для «реального» сервера. – DigitalJedi805

+0

Что еще вы хотели бы узнать? – DigitalJedi805

ответ

2

Try:

private static DnsEndPoint IP_END_POINT = new DnsEndPoint("192.168.0.36", 4525, AddressFamily.InterNetwork); 


public MainPage() 
{ 
    try 
    { 
     InitializeComponent(); 

     socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     SocketAsyncEventArgs connectEventArgs = new SocketAsyncEventArgs(); 
     connectEventArgs.RemoteEndPoint = IP_END_POINT; 
     connectEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(ConnectionEstablished); 

     if(!socket.ConnectAsync(connectEventArgs)) 
     { 
      ConnectionEstablished(/*Insert Args*/); //Handle real time execution 
     } 
    } 
    catch (Exception e) 
    { 
     //write error somewhere 
    } 
} 

documentation указывает, если ConnectAsync возвращает ложь, то «Событие SocketAsyncEventArgs.Completed на System.Net.Sockets.SocketAsyncEventArgs объект, переданный в параметре е не будет поднят.»

Кроме того, убедитесь, что вы где-то регистрируете исключение. Там может быть исключение, которое вы просто замерзаете.

Update:

  • ли вы проверить файл ClientAccessPolicy.xml? Вам нужно будет заменить все символы «и» на «.
  • Вы пробовали добавить connectEventArgs.UserToken = socket; до звонка ConnectAsync(connectEventArgs)?
  • Получает ли сервер запрос и отправляет ответ (может потребоваться использование Wireshark на клиенте)?
  • В то время как отладка connectEventArgs.Completed указывает на правильный метод?
  • Во время отладки, что произойдет, если вы «перешагнете» (F10) до тех пор, пока метод не вернется? Существуют ли другие методы?
  • В процессе отладки, если вы «Step Over» (F10) socket.ConnectAsync(connectEventArgs) (но все еще в методе) существуют ли другие потоки в окне Debug> Windows> Threads? Что произойдет, если вы переключитесь на другой поток (щелкните правой кнопкой мыши по потоку и выберите «Переключиться на поток» или дважды щелкните по нему)?

Дайте мне знать, как обстоят дела.

+0

Модифицированный для этой спецификации, и при отладке он попадает в '! Socket.ConnectAsync()', ловит «ложную» оценку (этой логики) и продолжает возвращаться. (ConnectAsync возвращает true) – DigitalJedi805

+0

@ DigitalJedi805 Я добавил некоторые дополнительные варианты устранения проблем. – Trisped

+0

@ DigitalJedi805 Извините, пропустили ваше обновление. Я бы предложил использовать Wireshark, чтобы проверить, что сетевая конфигурация соответствует ClientAccessPolicy, которую вы обслуживаете. – Trisped

Смежные вопросы