Silverlight 5 打开套接字访问被拒绝
Silverlight 5 Opening Socket AccessDenied
我有一个 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运行,如果我创建主机文件条目:
127.0.0.1 myapp.local
并更新我的 localhost
浏览器内实例(来自 VS 的 运行ning)以使用 myapp.local
,我可以重现相同的错误,这表明错误发生在根域不是 localhost
,无论应用程序托管在何处。
我已经检查了我的防火墙和防病毒软件的事件日志,寻找它们可能阻止连接请求的迹象,但没有看到任何证据。
有没有其他人遇到过这个问题并对我的问题可能是什么提出建议?
对于 Silverlight,您需要一个套接字策略服务器。
详情见http://msdn.microsoft.com/en-us/library/cc645032%28v=vs.95%29.aspx
根据问题的描述以及评论和文章 "Relaxed Cross-Domain Access Restrictions",我认为最有可能的是,当应用程序在 [=27] 中 运行 时,问题很可能是访问限制=] 模式。
要验证您的应用程序 运行 具有受信任的权限,您可以检查 属性 Application.HasElevatedPermissions
是否 true
。
此外,请尝试遵循本指南How to: Enable Trusted Applications to Run Inside the Browser
确保您的服务器的防火墙没有阻止 "policy server" 端口 943
如果您仍然无法连接到服务器,请尝试将您的服务工作的端口更改为 4502
到 4534
范围内的某个端口。
我有一个 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运行,如果我创建主机文件条目:
127.0.0.1 myapp.local
并更新我的 localhost
浏览器内实例(来自 VS 的 运行ning)以使用 myapp.local
,我可以重现相同的错误,这表明错误发生在根域不是 localhost
,无论应用程序托管在何处。
我已经检查了我的防火墙和防病毒软件的事件日志,寻找它们可能阻止连接请求的迹象,但没有看到任何证据。
有没有其他人遇到过这个问题并对我的问题可能是什么提出建议?
对于 Silverlight,您需要一个套接字策略服务器。 详情见http://msdn.microsoft.com/en-us/library/cc645032%28v=vs.95%29.aspx
根据问题的描述以及评论和文章 "Relaxed Cross-Domain Access Restrictions",我认为最有可能的是,当应用程序在 [=27] 中 运行 时,问题很可能是访问限制=] 模式。
要验证您的应用程序 运行 具有受信任的权限,您可以检查 属性 Application.HasElevatedPermissions
是否 true
。
此外,请尝试遵循本指南How to: Enable Trusted Applications to Run Inside the Browser
确保您的服务器的防火墙没有阻止 "policy server" 端口 943
如果您仍然无法连接到服务器,请尝试将您的服务工作的端口更改为 4502
到 4534
范围内的某个端口。