为什么我的Silverlight套接字策略文件不起作用?

时间:2012-05-10 20:33:01

标签: c# silverlight sockets cross-domain-policy

我有一个使用SL4的Silverlight客户端和一个使用.NET 4的C#服务器。服务器在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'事件最终会触发。然而,我从中得到的并不是那么令人鼓舞。

我最终得到了一个'AccessDenied'的SocketError,以及一条消息'尝试以一种被访问权限禁止的方式访问套接字。',并且可以预料,我的服务器永远不会接受连接。我知道服务器的端口是打开的,并且可以接受连接,所以这是一个令人困惑的场景。

再次感谢任何人的帮助。

1 个答案:

答案 0 :(得分:2)

尝试:

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返回false,然后“不会引发e参数中传递的System.Net.Sockets.SocketAsyncEventArgs对象上的SocketAsyncEventArgs.Completed事件。”

此外,请确保您在某处记录异常。可能有一个例外,你只是轻松过去。

<强>更新

  • 您检查过ClientAccessPolicy.xml文件了吗?您需要将所有“和”字符替换为“。
  • 您是否尝试在connectEventArgs.UserToken = socket;来电之前添加ConnectAsync(connectEventArgs)
  • 服务器是否收到请求并发送回复(可能需要在客户端使用Wireshark)?
  • 调试时connectEventArgs.Completed指向正确的方法吗?
  • 在调试时,如果你“跳过”(F10)直到方法返回会发生什么?是否有其他方法?
  • 在调试时,如果你“跳过”(F10)socket.ConnectAsync(connectEventArgs)(但仍然在方法中)是Debug&gt; Windows&gt; Threads窗口中还有其他线程吗?如果切换到另一个线程会发生什么(右键单击线程并选择“切换到线程”或双击线程)?

让我知道事情的结果。