【问题标题】:Why does my Silverlight Socket Policy File not work?为什么我的 Silverlight 套接字策略文件不起作用?
【发布时间】:2012-05-19 11:31:13
【问题描述】:

我有一个使用 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”事件最终会触发。然而,我从中得到的并不是那么令人鼓舞。

我最终得到一个 SocketError 的“AccessDenied”,并显示一条消息“试图以一种访问权限禁止的方式访问套接字。”,正如可以预料的那样,我的服务器从不接受连接.我知道服务器已经打开了端口,并且可以接受连接,所以这是相当令人困惑的场景。

再次感谢大家的帮助。

【问题讨论】:

  • 很难说不知道您使用什么系统将 Silverlight 应用程序与服务器连接。
  • “系统”是什么意思?我在 Windows 7 环境、客户端和服务器中运行。 Chrome 正在运行客户端。服务器为策略服务器和“真实”服务器打开一个 TcpListener。
  • 您还想知道什么?
  • 据我所知,只有一种方法可以将 Silverlight Socket 连接到任何类型的服务器,那就是通过 ConnectAsync 方法,正如我所提到的,我知道该方法有效。跨度>
  • 客户端如何连接到TcpListener?问题大概就在那里。我没有我的套接字代码,但如果你可以发布你的代码(说明客户端如何启动连接),我会在大约 6 小时后回家查看它。

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


【解决方案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
    }
}

documentation 表示如果ConnectAsync 返回 false 则“不会引发在 e 参数中传递的 System.Net.Sockets.SocketAsyncEventArgs 对象上的 SocketAsyncEventArgs.Completed 事件。”

另外,请确保您在某处记录异常。可能有一个例外,您只是轻而易举地过去。

更新:

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

让我知道结果如何。

【讨论】:

  • 修改为这个规范,并且在调试中,它命中'!socket.ConnectAsync()',捕获一个'假'评估(这个逻辑),并继续返回。 ( ConnectAsync 返回 true )
  • @DigitalJedi805 我添加了一些额外的故障排除选项。
  • @DigitalJedi805 抱歉,错过了您的更新。我建议使用 Wireshark 来验证网络配置是否与您正在服务的 ClientAccessPolicy 匹配。
  • 感谢@Trisped,我实际上设法以某种方式克服了这个问题。我可能会添加另一个答案。感谢您的帮助。
  • 你最后的解决方案是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2012-01-03
  • 2011-11-26
  • 1970-01-01
  • 2011-12-21
  • 2020-08-16
  • 1970-01-01
相关资源
最近更新 更多