我有一个Silverlight 5应用程序尝试建立与服务器的套接字连接,如下所示:
var targetEndpoint = new DnsEndPoint("subdomain.maindomain.com", 443);
var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var socketAsyncEventArgs = new SocketAsyncEventArgs {RemoteEndPoint = targetEndpoint};
socketAsyncEventArgs.Completed += AsyncConnectCallback;
clientSocket.ConnectAsync(socketAsyncEventArgs);
我在https://subdomain.maindomain.com/clientaccesspolicy.xml
处有以下clientaccesspolicy.xml文件:
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*" http-methods="*">
<domain uri="https://subdomain.maindomain.com"/>
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
<socket-resource port="4502" protocol="tcp"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
我能够从visual studio运行Silverlight应用程序的本地实例,并且可以建立套接字连接,既可以在浏览器中运行,也可以在浏览器外运行。当我部署应用程序时,我仍然能够使用浏览器外版本进行连接,但浏览器内版本错误,并显示以下消息:
AccessDenied: An attempt was made to access a socket in a way forbidden by its access permissions.
在我从Visual Studio运行的本地环境中,如果我创建了一个hosts文件条目:
127.0.0.1 myapp.local
并更新我的localhost
浏览器内实例(从VS运行)以使用myapp.local
,我可以重现相同的错误,这表明当根域不是{{1时发生错误无论托管应用程序的位置如何。
我已经检查了我的防火墙和防病毒软件的事件日志,看是否有可能阻止连接请求的迹象,但没有看到任何证据。
有没有其他人遇到过这个问题,并提出了我的问题可能是什么建议?
答案 0 :(得分:0)
对于Silverlight,您需要一个套接字策略服务器。 有关详细信息,请参阅详细信息http://msdn.microsoft.com/en-us/library/cc645032%28v=vs.95%29.aspx。
答案 1 :(得分:0)
根据问题的描述以及评论和文章"Relaxed Cross-Domain Access Restrictions",我认为最有可能的问题是当应用程序以“浏览器内”模式运行时访问限制。
要验证您的应用程序是否以受信任的权限运行,您可以检查该属性Application.HasElevatedPermissions
是否为true
。
另外,请尝试遵循本指南How to: Enable Trusted Applications to Run Inside the Browser
确保服务器的防火墙不会阻止“策略服务器”端口943
如果仍然无法连接到服务器,请尝试将服务所在的端口更改为4502
到4534
范围内的某个端口。