Почему мой файл политики сокетов Silverlight не работает?

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

Клиент пытается установить соединение с сервером, открывает соединение для файла политики, запрашивает файл политики и возвращает файл политики. Чего не происходит, так это события 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

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

Запрос кода Клиентское соединение

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

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» и сообщение «Была сделана попытка получить доступ к сокету способом, запрещенным его разрешениями на доступ», и, как и следовало ожидать, мой сервер никогда не принимает соединение. Я знаю, что у сервера открыт порт и он может принимать соединение, так что это довольно сложный сценарий.

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


person DigitalJedi805    schedule 10.05.2012    source источник
comment
Трудно сказать, не зная, какую систему вы используете для подключения приложения Silverlight к серверу.   -  person Trisped    schedule 11.05.2012
comment
Что вы имеете в виду под словом «система»? Я работаю в среде Windows 7, на клиенте и сервере. В Chrome запущен клиент. Сервер открывает TcpListener как для сервера политики, так и для «реального» сервера.   -  person DigitalJedi805    schedule 11.05.2012
comment
Что еще вы хотели бы знать?   -  person DigitalJedi805    schedule 11.05.2012
comment
Насколько мне известно, есть только один способ подключить Silverlight Socket к любому типу сервера - через метод ConnectAsync, который, как я уже упоминал, работает.   -  person DigitalJedi805    schedule 11.05.2012
comment
Как клиент подключается к TcpListener? Вероятно, проблема в этом. У меня нет с собой кода сокета, но если вы можете опубликовать свой код (иллюстрирующий, как клиент запускает соединение), я посмотрю на него, когда вернусь домой через ~ 6 часов.   -  person Trisped    schedule 11.05.2012
comment
Отредактировал мой код, чтобы включить это, но я не уверен, как помогает публикация кода, иллюстрирующего то, что я только что озвучил в своем последнем комментарии. Извините за разочарование, но на меня просто накричали за то, что я просил людей не тащить меня по «ненужной грязи». Поскольку вы настаиваете на том, что код необходим, он есть, и я очень признателен за вашу помощь; Я просто не понимаю, как это поможет больше, чем то, что я уже объяснил. : - /   -  person DigitalJedi805    schedule 11.05.2012
comment
Хорошо, спасибо. Как правило, укажите код, в котором возникла проблема. Не весь код, обычно метод. Также постарайтесь не включать комментарии, которые не имеют прямого отношения к проблеме. Я осмотрю это, когда вернусь домой, и дам вам знать, что я думаю.   -  person Trisped    schedule 11.05.2012
comment
Спасибо. Я воздержусь от комментариев; столь же всепоглощающий, как и искушение.   -  person DigitalJedi805    schedule 11.05.2012


Ответы (1)


Пытаться:

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
    }
}

В документации указано, если ConnectAsync возвращает false тогда «Событие SocketAsyncEventArgs.Completed в объекте System.Net.Sockets.SocketAsyncEventArgs, переданном в параметре e, не будет вызвано».

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

Обновление:

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

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

person Trisped    schedule 11.05.2012
comment
В соответствии с этой спецификацией и при отладке он попадает в '! Socket.ConnectAsync ()', улавливает «ложную» оценку (этой логики) и продолжает возвращаться. (ConnectAsync возвращает true) - person DigitalJedi805; 11.05.2012
comment
@ DigitalJedi805 Я добавил несколько дополнительных параметров устранения неполадок. - person Trisped; 11.05.2012
comment
@ DigitalJedi805 Извините, я пропустил ваше обновление. Я бы посоветовал использовать Wireshark для проверки соответствия конфигурации сети той ClientAccessPolicy, которую вы обслуживаете. - person Trisped; 11.05.2012
comment
Спасибо @Trisped, мне действительно как-то удалось это преодолеть. Скорее всего, я добавлю еще один ответ. Спасибо за помощь. - person DigitalJedi805; 11.05.2012
comment
Каково было ваше решение в итоге? - person ceebreenk; 21.10.2014
comment
@honeycomb Вам нужно добавить @ DigitalJedi805 (без пробела), чтобы он получил уведомление о том, что вы задали вопрос (поскольку он не писал то, что вы комментируете). Я предлагаю прокомментировать его вопрос, поскольку вы спрашиваете, что он сделал, а не то, что сделал я. - person Trisped; 21.10.2014
comment
Спасибо, моя беда, здесь уже поздняя ночь. Мне удалось разобраться в этом 5 минут назад, но для интереса @ DigitalJedi805, как вы решили свою проблему? - person ceebreenk; 21.10.2014