Asp.Net下的一些模块解决方案要点

一、验 证

验证其实是信息系统安全的一个子问题,里面的东西比较多,这里我只讲些容易遗漏的小点,其它的以后有时间再说。

当然在Asp.net环境下,我们当然用得最多的是自带的验证控件像RangeValidator、RegularExpressionValidator等等。但是这里要注意的是: 一、这些控件都是利用Javascript验证的,所以很容易被某些黑客绕过,造成非法输入导致服务器崩溃。这时候,最好在服务器端对输入再进行一次检测、或做好异常处理。这里还需要提的一点是脚本注入攻击的问题,这种东西,在网上一搜一大把,这里就不细说。主要要提下的是还可以通过一些像减少文本框输入这样的非技术解决方案来控制。二、有个CustomValidator控件是个比较好用东西,它可以帮我们很好地完成服务器端或复杂逻辑的验证(效率还很高,可以不用完全走完页生命周期),像前面说的脚本注入问题就可以利用这个控件来完成。三、善用ValidatorGroup做好验证控件管理问题(像Login控件里的验证)。

二、下载、上传

Asp.net环境下,下载一般有两种解决方案:

1.就是页面上用Response.WriteFile(filePath);方法将文件输出,原理跟导出GridVew一样。具体代码如下

        private void WriteFile(string filePath,string fileName)
        {
            //清空输出
            Response.Clear();
            Response.Buffer = true;
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"); //解决中文乱码

            //关闭ViewState以提高速度
            //this.EnableViewState = false;

            //不同格式文件的contentType有可能不同
            string extension = Path.GetExtension(filePath);
            //设置ContentType属性
            Response.ContentType = GetMimeType(extension);
            //如果文件类型不限的话,Response.ContentType = "application/unknown";
            Response.AppendHeader("Content-Disposition", "attachment;filename =" + fileName);
            Response.WriteFile(filePath);
            Response.Flush();
            Response.Close();
            Response.End();
        }

        //这里涉及到一个文件名加解密的问题,是为了防止文件具体名称暴露在状态栏中,所以添加一个FileHelper类
        //详细出处参考:http://www.jb51.net/article/17448.htm

        private string GetMimeType(string extension)
        {
            string mime = string.Empty;
            extension = extension.ToLower();
            switch (extension)
            {
                case ".avi": mime = "video/x-msvideo"; break;
                case ".bin": mime = "application/octet-stream"; break;
                case ".exe": mime = "application/octet-stream"; break;
                case ".dll": mime = "application/octet-stream"; break;
                case ".class": mime = "application/octet-stream"; break;
                case ".csv": mime = "text/comma-separated-values"; break;
                case ".css": mime = "text/css"; break;
                case ".doc": mime = "application/msword"; break;
                case ".dot": mime = "application/msword"; break;
                case ".gz": mime = "application/gzip"; break;
                case ".gif": mime = "image/gif"; break;
                case ".jpeg": mime = "image/jpeg"; break;
                case ".jpg": mime = "image/jpeg"; break;
                case ".jpe": mime = "image/jpeg"; break;
                case ".mpeg": mime = "video/mpeg"; break;
                case ".mpg": mime = "video/mpeg"; break;
                case ".mpe": mime = "video/mpeg"; break;
                case ".mp3": mime = "audio/mpeg"; break;
                case ".pdf": mime = "application/pdf"; break;
                case ".rar": mime = "application/octet-stream"; break;
                case ".txt": mime = "text/plain"; break;
                case ".xls": mime = "application/msexcel"; break;
                case ".xla": mime = "application/msexcel"; break;
                case ".z": mime = "application/x-compress"; break;
                case ".zip": mime = "application/x-zip-compressed"; break;
                default:
                    break;
            }
            return mime;
        }

2.就是写一个DownloadHandler,无非就是在IHandler接口中的ProcessRequest函数中调用上面封装好的函数。用这种方式的好处就是可以方便做盗链处理(主要就是判断前导页),还有就是效率比页面方式的高(不经过页生命周期的就是王道)。对了,写好Handler之后记得还要在Web.configj注册,具体代码如下

<httpHandlers>
      <add verb="*" path="*.rar" type="**.**.DownloadHandler" />
</httpHandlers>

注意path属性值这里只例出了rar后缀的注册。

3.上传(Upload)解决方案, 一般性质的上传就是托个Upload控件,然后操作FileUpload1.PostedFile就行了。但是这种做法有以下几个问题:一是上传对话框没有文件类型限制,二是大文件上传时不方便(没续传、没进度条、不能并行)。针对这种情况,有些做法是利用Flash来做上传控件,这样上传效果明显,又方便文件类型限制,且能多任务并行。配合这样一个Flash控件,还有就是个单独的上传的HttpHandler以提高效率。如果在.NET平台还可以选择用Silverlight替换Flash。

三、发送邮件

这个在网上随便搜下就可以找到解决方案,一般都是用System.Net.Mail命名空间下的MailMessage等相关类来操作,这里要注意的是,Webconfig里的登入凭据配置(配置system.net/mailSettings/smtp节),最后自己再写个bat来加密下配置节。.NET自带电邮类只能提供基本的发送功能,但是像收件或其它高级点的发件功能它就有点无能为力了,还有就是在邮件主体html编辑时还要自己写一个插件(这也是个问题),所以,如果想用这个做个邮箱功能的话,最好就是自己重新开发过一个,或是用第三方邮件类库。还有如果是自己写邮件群发的话,记得要使用多线程或异步。

四、生成图片验证码

这个网上也有源码,这里简述下原理。

步骤一:定义一个工具类,在其中添加生成验证码(可数字可字母)函数(其中要把一般要把验证码存入Session)

步骤二:在工具类中定义一个函数来实现验证码->图片字节流的转换(这里主要就是些GUI与IO操作)

步骤三:用一个页面(应该HttpHandler与可以,MVC下就是一个Controller的Action,Action返回File视图)来调这样的方法以输出字节流

步骤四:前台图片的src指向你生成字节流的URL。再加入前台脚本,就是单击图片的时候pic.src =url+"?timeSpan"

步骤五:后台通过Session验证,验证函数也可以在工具类中定义

五、.NET与Word、Excel、pdf等互操作

其中office的那套在Microsoft.Office.Interop.Word下,这个命名空间所在的dll在office软件安装目录里,帮助文档也在office里找,比如说Word,打开Word按Alt+F11,再按F1就可以了,要是没有就到word相关的目录下去找(网上搜得到)。其实做过Word或Excel编程的就知道就是些VBA的东西。pdf互操作就麻烦点,一般都要借助第三方类库。其实.NET互操作本身就是个比较麻烦的东西,有机会的话下次再详细介绍下。

六、.NET站内搜索

一般站内搜索都是通过数据库的全文的检索功能来完成,不过这样的做的话,对于某些公开性网站来说可能会有点慢了,这主要还要看搜索范围(比如一个论坛网站对话题内容所提供的搜索)与搜索优化。如果图省事的话,可以考虑用Google自定义搜索或Baidu自定义搜索(就是些Html API嵌入之类的),这种解决方案貌似会被Google或Baidu等抽流量,所以慎用。

七、.NET天气预报服务

像这种服务一般都是要调外部接口/服务(国内这种东西貌似都要付费,国外的话有些貌似是免费的)。这种东西肯定就是WebService技术之类。网上有那种通过Http请求新浪、腾讯气象网站(就是HttpWebRequsetHttpWebResponse的事),然后抓取页面内容,利用 正则或其它的东西提取出气象数据再呈现出来的方法,这种利用实时抓取内容到自己的网站的方式明显不可取(可能会侵权、流量什么的也可能会被这些网站抽取一部分)。不过,像新浪这种他提供了气象查询的嵌入Html。如:

    <iframe frameborder="0" src="http://php.weather.sina.com.cn/widget/weather.php" scrolling="no" width="246" height="360"></iframe>

总结

其实还有一些模块没有列举,有些是普通的.NET技术(分析下业务特点就可以很好解决),有些涉及一些比较复杂的内容(像日志等,以后会单独总结)、还有些是调用外部接口的应用(像在线支付,这就是看下API提供方的参考文档就行了)。总之对待这些通用模块,一定要注意代码的耦合性,注意每次累积一些特殊情况的解决方案就可以事倍功半了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值