设为首页 收藏本站
查看: 1251|回复: 0

[经验分享] 给IIS服务器添加Socket的设想及几个解决方案。

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-16 14:30:54 | 显示全部楼层 |阅读模式
我没想到可以直接在IIS里用Socket编程,这为我的项目添加了不少活力。大家应该知道,一但我可以在IIS里新建立一个Listen,还有什么不能做呢?

首选还是给出需求:大文件上传,保证可以断点上传!且记录上传日志。
前面好些文章已经讨论过,HTTP协议下是没有办法进行断点上传,所以用HTTP协议来解决这一问题是不用想了。
那么我们可以讨论的还有:CTP/IP,SOAP等几个可用。当然,可能还有其它的我不知道,也就不说了。
先说SOAP协议下的文件上专,前面我做一了个小项目,进行过测试,在基于HTTP协议下的WebService可以断点上传大文件。可以参考下文,有源文件下载:
http://www.iyunv.com/WuCountry/archive/2006/02/15/331248.html

然而在实际使用中,它的问题太明显了:效率极低。
在LAN里上传文件还可以接受,速度也还可以,但在Internnet上进行上传文件时,经常出现超时情况,几乎无法上传文件。因为WebService的每一个函数调用都有返回,如果上次调用没有返回那么就不能进行第二次的调用(否则文件混乱)。而因为网络不稳定的情况下,大部份时间消耗在来回的调用上,而不是数据的传输。例如:每次调用上传10K的数据,根据不同的网络情况,客户端等的时间不一致,大概是60秒左右,如果没有返回,那么不得不重新调用函数检查服务器上文件的大小重新上传,并减小上传数据。最后一至到1K,结果还是有超时,当然相对会少一些。也可以适当的延长超时的时间,但不管怎样,最后平均算下来的上传速度十再是不敢恭维。
然而这一解决方案也并不是完全无可取之外,在网络环境极好的情况下,它的效率还是可以的,而且实现也简单,再加上MS强大的WebService技术支持,升级及维护也简单。所以我个人还是很喜欢这样的解决方法的。如果不是因为网络环境的约束,我还真想就用这个方案。

另一个方法就是用TCP/IP直接用Socket连接来上传文件。它的上传效率与FTP是一致的,因为FTP也是用的TCP/IP协议,因此,完全可以考虑在网络环境不好的情况下用这一解决方案。然而它的不利之处就是:服务器的架设。其实服务器端的代码完全可以说是一个FTP的架构了,就看你实现多少命令。且不管这些,如果在IIS服务器启动这一服务,里采用这一方案的核心问题。首先,把服务器端与客户端的程序都写好,服务器端写成组件的形式,方便下面的部署。当然,如果你把服务器端的也写成UI程序,然后在服务器上启动它也行,然而我就是想让它与IIS绑定在一起,最后是与有的ASP.net应用程序绑定。
好了,我还是决定用组件的形式来完成。它有一个好处,就是在部署时有更多的选择。先看在ASP.net应用程序里的部署。
因为只用在服务器上开一个监听端口就行了,所以直接配置Config文件,指定IP与端口。然而在Global里启动它。因为只用启动一次,所在放在静态构造函数里就行了。


DSC0000.gif         static Global()
DSC0001.gif DSC0002.gif          DSC0003.gif {
DSC0004.gif             //
            if(Global.M_WaveUpService==null)
DSC0005.gif DSC0006.gif             {
                Global.M_WaveUpService = new WaveUpService();
                Global.M_WaveUpService.M_SystemVideoPath = Global.M_SystemPath;
                Global.M_WaveUpService.StartWaveUpService();
DSC0007.gif             }
DSC0008.gif         }

然而这样的问题是:如果IIS出现错误,导致服务停止,再由谁来启动服务呢?这是很头疼的问题。必须重新请求一次页面能让服务重新启动。这是我不想看到的。
而且如果因为服务出现问题,而不是IIS,也就是说,就算我重新请求了页面,而这个静态的Global也不一定执行时,那就先郁闷了。有一个解决方法就是重新写一个管理页面来完成服务器的管理。而这样就更麻烦了,谁会因为服务不能运行而登录到网站重新启动服务呢?而且服务也只有管理员才能管理。所以,这样的一个方法在试运行了几天后,放弃了。

如果要让服务可以长期稳定的运行,除了前面的方法写一个UI程序来运行外,还有一个解决方法就是做Windows服务(详细的可以在MS上查找Windows Service得到更多的帮助)。这一解决方法我觉得很不错,它就像是在服务器上安装了一FTP服务一样,当然它只为你个人的服务运行。这是一个备选方案,它唯一不好的就是更新,要重新安装与测试。而且要有自己的服务器。

想在IIS上直接启动服务,还有一个方法就是借助WebService来启动及维护服务,然后用Socket来连接。它的做法介于上面的两种方案之间。

        [WebMethod]
        public bool GetWaveUpService()
        {
            if(WaveUpWebService.M_WaveUpService==null)
            {
                WaveUpWebService.M_WaveUpService = new WaveUpService();
                WaveUpWebService.M_WaveUpService.M_SystemVideoPath = WaveUpWebService.M_SystemPath;
                WaveUpWebService.M_WaveUpService.StartWaveUpService();
                return true;
            }
            else if(!WaveUpWebService.M_WaveUpService.M_WaveUpServer.M_IsLinstening)
            {
                WaveUpWebService.M_WaveUpService.Dispose();
                WaveUpWebService.M_WaveUpService = new WaveUpService();
                WaveUpWebService.M_WaveUpService.M_SystemVideoPath = WaveUpWebService.M_SystemPath;
                WaveUpWebService.M_WaveUpService.StartWaveUpService();
                return true;
            }
            else
            {
                return true;
            }
        }这是一个不错的方法。唯一不好的就是内存与线程都在IIS内,容易使IIS挂掉。当然也没什么太大关系,如果真的IIS出现问题,也可以直接再调用WebService方法来恢复。

以上是一些简单的想法,目前项目里对于以上几种方法都实现了,具体的会采用哪一种,到后来再看吧。
我个人认为WindowsService应该是一个不错的选择,不出意外的话,我想我的项目里应该采用这一方案,毕竟它的潜力很大。而且稳定性很好。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-99852-1-1.html 上篇帖子: Ghost 安装iis打不开网页解决办法 下篇帖子: 让win2003/win2000 IIS支持shtml
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表