基于SilverLight的Socket连接时,出现AccessDenied错误

pizichongzhz 2014-12-02 04:50:11
求救求救。。。我用SilverLight做了一个关于Socket通信的项目,监听的是4530端口,为什么我在本地测试的时候,可以,没有出现错误,但是发布到IIS之后,部署到服务器上,出现了AccessDenied的访问权限的错误?同一个局域网内访问我的网址,是可以进行登录的,但是外网点击登录按钮的时候,出现了AccessDenied的错误。不是端口映射或者外网IP设置的问题,943端口的监听也开启了。。。请问这到底是啥问题啊。。。十万火急呢
...全文
698 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
嗯,随手写的,可能应该去掉里边的try{}。 你可以在程序中(至少)写入两条记录日志记录,一条记录来源,另一条记录输出是否成功完成。然后判断这个服务运行是否正常。
  • 打赏
  • 举报
回复
既然你有这个服务,那么就记录日志,记录下每一次被请求的情况(时间、客户端的ip和端口),并且是否成功走到了EndSendFile(ar)之后的地方。如果没有成功Send,那么你容错也没有用,只会掩盖943端口的授权问题,只会让客户端“死机”。 不是每一个服务都应该容错的。像这种只有简单地“输出一个‘死的’字符串”的服务,根本不应该容错。一方面是它太简单太直接,另一方面是它要是稍微有一点bug那么整个系统前端slverlight程序就垮了,所以这个程序需要没有半点异常。 你写的实在是太复杂了。这个服务不需要像其它业务服务那样写的很复杂。只需要几句即可,例如
void Start()
{
    _Listener = new TcpListener(IPAddress.Any, 943);
    _Listener.Start();
   _Listener.BeginAcceptTcpClient(OnBeginAccept, null);
}

private void OnBeginAccept(IAsyncResult ar)
{
    try
    {
        var client = _Listener.EndAcceptTcpClient(ar);
        try
        {
            var buffer = new byte[100];
            int len = -1;
            while (client.Available > 0 && len != 0)
                len = client.Client.Receive(buffer);
            var data = Encoding.UTF8.GetBytes(Properties.Resources._943policy);   //从资源文件中取得授权文本
           client.Client.Send(data);
            client.Close();
       }
        finally
        {
            _Listener.BeginAcceptTcpClient(OnBeginAccept, null);
        }
    }
}
pizichongzhz 2014-12-02
  • 打赏
  • 举报
回复
#4 这是我写的启动943端口监听的服务 #region 变量区 /// <summary> /// 从TCP网络客户端侦听连接 /// </summary> TcpListener _Listener = null; /// <summary> /// 为TCP网络服务提供客户端连接 /// </summary> TcpClient _Client = null; /// <summary> /// 通知一个或多个正在等待的线程已发生时间 /// </summary> static ManualResetEvent _TcpClientConnected = new ManualResetEvent(false); /// <summary> /// Silverlight客户端自动向943端口的服务器端发送一个<policy-file-request/>的语句请求,这里是服务端,用于接收 /// </summary> const string _PolicyRequestString = "<policy-file-request/>"; /// <summary> /// 接收信息的长度 /// </summary> int _ReceivedLength = 0; /// <summary> /// policy策略文件字节数组 /// </summary> byte[] _Policy = null; /// <summary> /// 接收文件的字节数组 /// </summary> byte[] _ReceiveBuffer = null; #endregion #region 初始化clientaccesspolicy.xml文件数据 /// <summary> /// 初始化clientaccesspolicy.xml文件数据 /// </summary> private void InitializeData() { /// 获取文件的路径拼接 string policyFile = Path.Combine(Application.StartupPath, "clientaccesspolicy.xml"); /// 创建文件字节流,并打开 using (FileStream fs = new FileStream(policyFile, FileMode.Open)) { /// 重置policy策略文件字节数组大小 _Policy = new byte[fs.Length]; /// 读取文件内容 fs.Read(_Policy, 0, _Policy.Length); } /// 重置接收字符串字节数组 _ReceiveBuffer = new byte[_PolicyRequestString.Length]; } #endregion #region 开启策略文件服务的监听 /// <summary> /// 开启策略文件服务的监听 /// </summary> public void StartSocketServer() { InitializeData(); try { /// 监听943端口 _Listener = new TcpListener(IPAddress.Any, 943); /// 开启客户端侦听 _Listener.Start(); while (true) { /// 设置时间状态为非终止 _TcpClientConnected.Reset(); /// 开启监听TCP客户端的监听的回调函数 _Listener.BeginAcceptTcpClient(new AsyncCallback(OnBeginAccept), null); _TcpClientConnected.WaitOne(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } #endregion #region 开始接收 /// <summary> /// 开始接收 /// </summary> /// <param name="ar"></param> private void OnBeginAccept(IAsyncResult ar) { /// 异步接收传入的连接尝试,并创建新的TCPClient来处理远程主机通信 _Client = _Listener.EndAcceptTcpClient(ar); /// 开始从连接的Socket中异步接收数据 /// _ReceiveBuffer:接收数据存入变量 /// policy策略文件字符串大小 _Client.Client.BeginReceive(_ReceiveBuffer, 0, _PolicyRequestString.Length, SocketFlags.None, new AsyncCallback(OnReceiveComplete), null); } #endregion #region 接收数据回调函数 /// <summary> /// 接收数据回调函数 /// </summary> /// <param name="ar"></param> private void OnReceiveComplete(IAsyncResult ar) { try { _ReceivedLength += _Client.Client.EndReceive(ar); if (_ReceivedLength < _PolicyRequestString.Length) { _Client.Client.BeginReceive(_ReceiveBuffer, _ReceivedLength, _PolicyRequestString.Length - _ReceivedLength, SocketFlags.None, new AsyncCallback(OnReceiveComplete), null); return; } string request = System.Text.Encoding.UTF8.GetString(_ReceiveBuffer, 0, _ReceivedLength); if (StringComparer.InvariantCultureIgnoreCase.Compare(request, _PolicyRequestString) != 0) { _Client.Client.Close(); return; } _Client.Client.BeginSend(_Policy, 0, _Policy.Length, SocketFlags.None, new AsyncCallback(OnSendComplete), null); } catch (Exception) { _Client.Client.Close(); } _ReceivedLength = 0; _TcpClientConnected.Set(); //Allow waiting thread to proceed } #endregion #region 发送数据回调函数 /// <summary> /// 发送数据回调函数 /// </summary> /// <param name="ar"></param> private void OnSendComplete(IAsyncResult ar) { try { _Client.Client.EndSendFile(ar); } catch (Exception) { } finally { _Client.Client.Close(); } } #endregion
  • 打赏
  • 举报
回复
引用 楼主 pizichongzhz 的回复:
943端口的监听也开启了
943端口用什么服务程序来提供服务? 如果没有,那么你缺少这个。
pizichongzhz 2014-12-02
  • 打赏
  • 举报
回复
依旧感谢亲的回复
沐青衣 2014-12-02
  • 打赏
  • 举报
回复
刚刚没看全文,1楼瞎扯。
沐青衣 2014-12-02
  • 打赏
  • 举报
回复
把IIS 应用程序池的进程模型标识改成“本地系统”如何。

1,978

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧