asp.net学习技术总结

本文主要介绍近期内LZ学习所接触到的一些技术和面试的一些个人心得,供以后查看,大部分仅是记录下来没有做详细的介绍,先贴出目录,欢迎交流,一块学习共同进步

-----------------------------------------分割线-----------------------------------------------

目录

XSS攻击:跨站脚本攻击(Cross Site Scripting) 1

Cookie安全问题... 2

邮件验证:... 3

找回密码功能... 5

Membership用户验证... 5

VSS演示... 7

支付宝接口... 7

存储过程... 7

多态设计模式  接口... 7

单例模式序列化等... 7

委托验证控件... 9

正则表达式... 9

MVC模式... 9

多线程问题... 12

敏感词处理... 12

linq1. 12

FileStream文件流... 12

动态页面静态化... 12

jQuery. 13

javascript 13

文本编辑器CKEditor 13

HTML5. 13

JSON文件... 13

站内搜索... 14

Entity.Framework. 16

网站优化... 16

缓存... 16

URL重写... 18

站点地图... 19

广告位管理 1.新建数据库   广告位表、广告表... 19

Flush播放... 19

焦点图... 19

代码调优... 19

Memcached. 19

面试技巧... 19

 

 

 

 

 

 

 

XSS攻击:跨站脚本攻击(Cross Site Scripting)

XSS攻击的危害包括

1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号

2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

3、盗窃企业重要的具有商业价值的资料

4、非法转账

5、强制发送电子邮件

6、网站挂马

7、控制受害者机器向其它网站发起攻击

 

传统防御技术  @Ajax.JavaScriptStringEncode(ViewBag.Message)

2.1.2 基于代码修改的防御

和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:

步骤1、对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。

步骤2、实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。

步骤3、确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。

当然,如上操作将会降低Web业务系统的可用性,用户仅能输入少量的制定字符,人与系统间的交互被降到极致,仅适用于信息发布型站点。并且考虑到很少有Web编码人员受过正规的安全培训,很难做到完全避免页面中的XSS漏洞。

 

混淆代理

<img src=”/account/logout”/>   本来是想获取图片的   结果退出登录  请求类型    Get

 

CSRF

CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作。例如:一个网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚发布了一个具有Bob银行链接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,并将此链接作为图片tag。如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。

CSRF是一种依赖web浏览器的、被混淆过的代理人攻击(deputy attack)。在上面银行示例中的代理人是Bob的web浏览器,它被混淆后误将Bob的授权直接交给了Alice使用。

下面是CSRF的常见特性:

依靠用户标识危害网站

利用网站对用户标识的信任

欺骗用户的浏览器发送HTTP请求给目标站点

另外可以通过IMG标签会触发一个GET请求,可以利用它来实现CSRF攻击

 

 

破解:

在每个表单请求中插入一个隐藏的输入元素,

<@Html.AntiForgeryToken()>

<input type=”hidden” value=”2432410dewf332d23dd3”>

 

2.HttpReffer验证    判断提交的请求是否来自自己的站点   达到破解的目的

 

Antixss

AntiXSS,由微软推出的用于防止XSS攻击的一个类库,可实现输入白名单机制和输出转义

  文章最后有antixx演示工程下载

  msi安装程序,安装之后,安装目录下有以下文件

  AntiXSS.chm   包括类库的操作手册参数说明

  HtmlSanitizationLibrary.dll    包含Sanitizer类(输入白名单)

  AntiXSSLibrary.dll    包含Antixss,Encoder类(输出转义)

  使用时在工程内添加引用HtmlSanitizationLibrary.dll 和AntiXSSLibrary.dll

  导入命名空间using Microsoft.Security.Application;

 

 

Cookie安全问题

Cookie盗窃

利用xss漏洞远程获取用户的cookie文件   利用用户的身份办坏事

破解:

HttpOnly      设置cookie为只读就行

Response.Cookie[“myCookie”].HttpOnly=true;

 

在全站点设置cookie为只读 配置wen.config   文件

<httpCookie domain=”” httpOnlyCookie=”true” requires=”filse”>

 

 

邮件验证:

邮件验证   MD5加密    对邮件的MD5加密

对于.NET而言,从2.0开始,发邮件已经是一件非常easy 的事了。下面我给出一个用C#群发邮件的实例,做了比较详细的注解,希望对有需要的朋友有所help。

// 引入命名空间
using System.Net;
using System.Net.Mail;

SmtpClient smtp = new SmtpClient(); //实例化一个SmtpClient
smtp.DeliveryMethod = SmtpDeliveryMethod.Network; //将smtp的出站方式设为 Network
smtp.EnableSsl = false;//smtp服务器是否启用SSL加密

smtp.Host = "smtp.163.com"; //指定 smtp 服务器地址
smtp.Port = 25;             //指定 smtp 服务器的端口,默认是25,如果采用默认端口,可省去

//如果你的SMTP服务器不需要身份认证,则使用下面的方式,不过,目前基本没有不需要认证的了
smtp.UseDefaultCredentials = true;
//如果需要认证,则用下面的方式
smtp.Credentials = new NetworkCredential("邮箱帐号@163.com", "邮箱密码");

MailMessage mm = new MailMessage(); //实例化一个邮件类

mm.Priority = MailPriority.High; //邮件的优先级,分为 Low, Normal, High,通常用 Normal即可

mm.From = new MailAddress("邮箱帐号@163.com", "真有意思", Encoding.GetEncoding(936));
//收件方看到的邮件来源;
//第一个参数是发信人邮件地址
//第二参数是发信人显示的名称
//第三个参数是 第二个参数所使用的编码,如果指定不正确,则对方收到后显示乱码
//936是简体中文的codepage值

注:上面的邮件来源,一定要和你登录邮箱的帐号一致,否则会认证失败

mm.ReplyTo = new MailAddress("test_box@gmail.com", "我的接收邮箱", Encoding.GetEncoding(936));
//ReplyTo 表示对方回复邮件时默认的接收地址,即:你用一个邮箱发信,但却用另一个来收信
//上面后两个参数的意义, 同 From 的意义

mm.CC.Add("a@163.com,b@163.com,c@163.com");
//邮件的抄送者,支持群发,多个邮件地址之间用 半角逗号 分开

//当然也可以用全地址,如下:
mm.CC.Add(new MailAddress("a@163.com", "抄送者A", Encoding.GetEncoding(936)));
mm.CC.Add(new MailAddress("b@163.com", "抄送者B", Encoding.GetEncoding(936)));
mm.CC.Add(new MailAddress("c@163.com", "抄送者C", Encoding.GetEncoding(936)));

mm.Bcc.Add("d@163.com,e@163.com");
//邮件的密送者,支持群发,多个邮件地址之间用 半角逗号 分开

//当然也可以用全地址,如下:
mm.CC.Add(new MailAddress("d@163.com", "密送者D", Encoding.GetEncoding(936)));
mm.CC.Add(new MailAddress("e@163.com", "密送者E", Encoding.GetEncoding(936)));

mm.Sender = new MailAddress("xxx@xxx.com", "邮件发送者", Encoding.GetEncoding(936));
//可以任意设置,此信息包含在邮件头中,但并不会验证有效性,也不会显示给收件人
//说实话,我不知道有啥实际作用,大家可不理会,也可不写此项

mm.To.Add("g@163.com,h@163.com");
//邮件的接收者,支持群发,多个地址之间用 半角逗号 分开

//当然也可以用全地址添加

mm.To.Add(new MailAddress("g@163.com", "接收者g", Encoding.GetEncoding(936)));
mm.To.Add(new MailAddress("h@163.com", "接收者h", Encoding.GetEncoding(936)));

mm.Subject = "这是邮件标题"; //邮件标题
mm.SubjectEncoding = Encoding.GetEncoding(936);
// 这里非常重要,如果你的邮件标题包含中文,这里一定要指定,否则对方收到的极有可能是乱码。
// 936是简体中文的pagecode,如果是英文标题,这句可以忽略不用

mm.IsBodyHtml = true; //邮件正文是否是HTML格式

mm.BodyEncoding = Encoding.GetEncoding(936);
//邮件正文的编码, 设置不正确, 接收者会收到乱码

mm.Body = "<font color="red">邮件测试,呵呵</font>";
//邮件正文

mm.Attachments.Add( new Attachment( @"d:a.doc", System.Net.Mime.MediaTypeNames.Application.Rtf ) );
//添加附件,第二个参数,表示附件的文件类型,可以不用指定
//可以添加多个附件
mm.Attachments.Add( new Attachment( @"d:b.doc") );

smtp.Send( mm ); //发送邮件,如果不返回异常, 则大功告成了。

 

找回密码功能

需求:用户输入用户名,如果用户名存在,则显示密码问题要求用户输入答案(思考为什么?),用户答案输入正确则随机生成一个密码(思考为什么不把旧密码发给用户),用新密码修改旧密码,并向用户名的邮箱发送新的密码,提示用户“新密码已经发送到你的a***@163.com的邮箱”(思考不显示全邮箱名有什么好处)。在成品系统中演示流程。

技术点:

–  开发的时候注意分层,不要把太多的代码写到UI层。

–  只有设置requiresQuestionAndAnswer=“true”以后ResetPassword才会检查密码问题

–  调用MembershipUser的ResetPassword方法来根据密码问题答案重置密码,如果答案错误,则抛出MembershipPasswordException, ResetPassword方法返回随机生成的密码,返回的密码太复杂,因此需要生成一个6位的随机密码(思考,参考备注),调用ChangePassword修改密码。

–  如何把Email进行掩码处理,也就是asfdasfd@163.com→a*****@163.com

 

Membership用户验证

在 ASP.NET 应用程序中,Membership 类用于验证用户凭据并管理用户设置(如密码和电子邮件地址)。Membership 类可以独自使用,或者与 FormsAuthentication 一起使用以创建一个完整的 Web 应用程序或网站的用户身份验证系统。Login 控件封装了 Membership 类,从而提供一种便捷的用户验证机制。

功能:

Membership 类提供的功能可用于:

创建新用户。

将成员资格信息(用户名、密码、电子邮件地址及支持数据)存储在 Microsoft SQL Server 或其他类似的数据存储区。

对访问网站的用户进行身份验证。可以以编程方式对用户进行身份验证,也可以使用 Login 控件创建一个只需很少代码或无需代码的完整的身份验证系统。

管理密码,包括创建、更改、检索和重置密码等等。可以选择配置 ASP.NET 成员资格以要求一个密码提示问题及其答案来对忘记密码的用户的密码重置和检索请求进行身份验证

虽然 ASP.NET 成员资格是 ASP.NET 中用来进行身份验证的独立功能,但它可以与 ASP.NET 角色管理集成来为站点提供授权服务。成员资格还可以与 ASP.NET 用户的 System.Web.Profile 集成,以提供可为各个用户量身订做的特定于应用程序的自定义实现。有关详细信息,请参见 了解角色管理 和 ASP.NET 配置文件属性概述。

Membership 类依赖于成员资格提供程序与数据源通信。.NET Framework 包括一个 SqlMembershipProvider(将用户信息存储在 Microsoft SQL Server 数据库中)和一个 ActiveDirectoryMembershipProvider(允许在 Active Directory 或 Active Directory 应用程序模式 (ADAM) 服务器上存储用户信息)。还可以实现一个自定义成员资格提供程序与可由 Membership 类使用的其他类似的数据源进行通信。自定义成员资格提供程序将继承 MembershipProvider抽象类。有关更多信息,请参见 实现成员资格提供程序。

默认情况下,ASP.NET 成员资格可支持所有 ASP.NET 应用程序。默认成员资格提供程序为 SqlMembershipProvider 并在计算机配置中以名称 AspNetSqlProvider 指定。SqlMembershipProvider 的默认实例配置为连接到 Microsoft SQL Server 的一个本地实例。

可以通过修改默认设置将一个非 AspNetSqlProvider 实例的 SqlMembershipProvider 指定为默认提供程序,或使用 Web.config 文件将自定义提供程序的实例指定为 ASP.NET 应用程序的默认提供程序。可以使用 Web.config 文件中 membership 配置节来为 Web 应用程序指定 ASP.NET 成员资格配置。可以使用 membership 节的 providers 子节来指定默认提供程序之一以外的成员资格提供程序。例如,下面的 membership 节从当前应用程序配置中移除默认成员资格提供程序并添加一个名为 SqlProvider 的新提供程序,它连接到名为 MySqlServer 的 SQL Server 实例。

 

Web.config 文件配置代码

<connectionStrings>

    <add name="ConnectionString" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Membership;Integrated Security=True;"/>

  </connectionStrings>

<membership defaultProvider="mySqlMembershipProvider">

      <providers>

        <add name="mySqlMembershipProvider"

             type="System.Web.Security.SqlMembershipProvider, &#xD;&#xA;               System.Web, Version=4.0.0.0, Culture=neutral, &#xD;&#xA;               PublicKeyToken=b03f5f7f11d50a3a"

 

 

          connectionStringName="ConnectionString"

          enablePasswordRetrieval="false"

          enablePasswordReset="true"

          requiresQuestionAndAnswer="true"

          applicationName="TestMembership"

          requiresUniqueEmail="true"

          passwordFormat="Hashed"

          maxInvalidPasswordAttempts="5"

          minRequiredPasswordLength="6"

          minRequiredNonalphanumericCharacters="0"

          passwordAttemptWindow="10"

          passwordStrengthRegularExpression=""/>

 

      </providers>

    </membership>

 

VSS演示

VSS项目进度  代码管理器

VSS 的全称为 Visual Source Safe 。作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目。管理软件开发中各个不同版本的源代码和文档,占用空间小并且方便各个版本代码和文档的获取,对开发小组中对源代码的访问进行有效的协调。

安装及使用教程:http://www.cnblogs.com/stillful/archive/2009/03/24/1420880.html

支付宝接口

通过url地址和支付宝双方的一种协定     使用MD5加密   添加一个只有双发知道的中间值   在MD5中

详情请参照另一篇博客:http://www.cnblogs.com/robin-zgp/articles/3139777.html

存储过程

事务   begin transaction   rollback transaction  

Proc 创建存储过程   exec调用存储过程

作用:实现分页等  多种方法

详情请参照另一篇博客:http://www.cnblogs.com/robin-zgp/articles/3127463.html

多态设计模式  接口

多态是实现设计模式的基础      大多数设计模式是基于多态和接口的

详情请参照另一篇博客:http://www.cnblogs.com/robin-zgp/articles/3129379.html

单例模式序列化等

单例模式序列化   创建一个类  并把构造函数定义为私有 不允许别人直接调用   再在内部实现一个本身类的静态对象    创建一个方法调用静态对象

一般Singleton模式通常有三种形式:

第一种形式: 也是常用的形式。

public class Singleton {

private static Singleton instance = null;

private Singleton(){

//do something

}

public static Singleton getInstance(){

if(instance==null){

instance = new Singleton();

}

return instance;

}

}

第二种形式:

public class Singleton {

//在自己内部定义自己的一个实例,只供内部调用

private static Singleton instance = new Singleton();

private Singleton(){

//do something

}

//这里提供了一个供外部访问本class的静态方法,可以直接访问

public static Singleton getInstance(){

return instance;

}

}

第三种形式: 双重锁的形式。

public class Singleton {

private static Singleton instance = null;

private Singleton(){

//do something

}

public static Singleton getInstance(){

if(instance==null){

synchronized(Singleton.class){

if(null == instance){

instance = new Singleton();

}

}

}

return instance;

}

}//这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。

序列化产考博文:http://www.cnblogs.com/robin-zgp/archive/2013/06/04/3116573.html

委托验证控件

委托验证控件   C#的高级属性   委托的使用

步骤:

l  定义一个委托

l  声明委托对象

l  定义委托要调用的对象

l  委托添加委托事件

l  调用

正则表达式

C#:Regex   Match 类的使用

Javascrip:RegExp  字符串本身的方法   match()

MVC模式

MVC生命周期:

HTTP请求——>路由——>控制器——>视图结果——>视图引擎——>视图——>视图——>响应

Mvc模式的应用

引擎     aspx    Razor   差别

视图    控制器     模型

智能关于Email问题   

显示声明调用     @(变量)fewf

<span>(@app).Models</span>

        <span>@(app).Models</span>

结果   (myapp).Model     smyapp.Models

注释:

@*   你好这里是注释   *@

 

ViewBag.user     ViewBag后直接跟变量即可实现视图读取控制器传递信息

布局:

//模板页面

<!DOCTYPE html />

<html>

    <head>

        <title>@ViewBag.title</title>

    </head>

    <body>

        <h1>@ViewBag.title</h1>

        <div id="main-count">

          @RenderBody() 

        </div>

 

<footer>@RenderSection("Footer")</footer>

 

    </body>

</html>

 

调用页面:

@{

    Layout = "SiteLayout.cshtml";        @*调用模板的地址*@

    ViewBag.Title = "Buy";

}

@section Footer{                       //当模板添加其他的模块的时候

    zheshi   Footer

}

 

<h1>这里是内容</h1>

模型 作用 连接控制器与数据库

public class MusicStoreDB:DbContext

    {

        public DbSet<Album> Albums { get; set; }

        public DbSet<Artist> Artists { get; set; }

        public DbSet<Genre> Genres { get; set; }

    }

验证问题

在模型类中定义:

标签

[Required]

[MaxLength(160)]

自定义验证条件

[RegularExpression(@"^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$", ErrorMessage = "要求是邮箱格式")]  

Range(35,44)

 

CSRF

破解:

在每个表单请求中插入一个隐藏的输入元素,

<@Html.AntiForgeryToken()>

<input type=”hidden” value=”2432410dewf332d23dd3”>

 

 

HttpReffer   判断提交的请求是否来自自己的站点   达到破解的目的

 

Cookie盗窃

利用xss漏洞远程获取用户的cookie文件   利用用户的身份办坏事

破解:

HttpOnly      只读就行

Response.Cookie[“myCookie”].HttpOnly=true;

 

在wen.config   文件中设置

<httpCookie domain=”” httpOnlyCookie=”true” requires=”filse”>

 

路由机制

public static void RegisterRoutes(RouteCollection routes)

        {

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 

            routes.MapRoute(

                "Default", // 路由名称

                "{controller}/{action}/{id}", // 带有参数的 URL

                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值

            );

路由约束

 

        }

 

多线程问题

thread1.Abort();        //销毁线程

thread1.Suspend();  //挂起线程

thread1.Resume()     //继续挂起的线程

thread1.start();

 

摇奖机

敏感词处理

很显示的问题  StringBuilder

 

步骤:

定义一个敏感词文件

定义字符串变量   赋值要检查的文字  

用正则表达式//替换所有的非中文字符  网上查的

Foreach  循环检查定义的字符串

如果什么 什么操作

linq1

from i in values where i > 10 orderby i descending select "[" + i + "]";

 

简单的应用linq

 

FileStream文件流

高级文件流

压缩  解压

文件缓存等

 

动态页面静态化

URL重写   当请求发生的时候先出发   Application_BeginRequest

用正则表达式 重写URL地址

再请求

 

为什么动态页面静态化    

百度搜索引擎   蜘蛛

?参数不识别

尽量用javascript   实现页面静态化

jQuery

javascript

文本编辑器CKEditor

配置   还是页面静态化   swfuplode插件  用于上传文件的

HTML5

简单的了解     视频 音频  标签

本地数据库    sessionStorage   localStorage   后面的参数随便添加

<viewport>   自动根据窗口大小调整页面   适配

Web works  ie 不支持   其他还行

 

JSON文件

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

数据结构为 {key:value,key:value,...}的键值对的结构

站内搜索

使用技术:Log4Net   Appender

添加对log4net.dll的引用

新建一个控制台项目,添加一个“应用程序配置文件”(App.config)

在App.Config或者Web.Config的添加配置,见备注

初始化:在程序最开始加入log4net.Config.XmlConfigurator.Configure();

在要打印日志的地方LogManager.GetLogger(typeof(Program)).Debug("信息"); 。通过LogManager.GetLogger传递要记录的日志类类名获得这个类的ILog(这样在日志文件中就能看到这条日志是哪个类输出的了),然后调用Debug方法输出消息。因为一个类内部不止一个地方要打印日志,所以一般把ILog声明为一个static字段。

输出错误信息用ILog.Error方法,第二个参数可以传递Exception对象。log.Error("***错误"+ex),log.Error("***错误",ex)

测试代码:见附件。

1、Log4Net配置

<configuration>

  <configSections>

    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

  </configSections>

  <log4net>

    <!-- Define some output appenders -->

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">

      <file value="test.txt"/>

      <appendToFile value="true"/>

      <maxSizeRollBackups value="10"/>

      <maximumFileSize value="1024KB"/>

      <rollingStyle value="Size"/>

      <staticLogFileName value="true"/>

      <layout type="log4net.Layout.PatternLayout">

        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>

      </layout>

    </appender>

    <root>

      <level value="DEBUG"/>

      <appender-ref ref="RollingLogFileAppender"/>

    </root>

  </log4net>

</configuration>

 

Lucene.Net 搜索 文本信息      有Lucene 移植过来的

分词算法

 

定时框架  :quartz.Net

SEO   搜索引擎优化

 

开源项目

Npoi  jQuery 

 

分词算法

 多态的使用

Analyzer analyzer = new StandardAnalyzer();   //按单个字词分词

Analyzer analyzer = new CJKAnalyzer();        //两个字分词

Analyzer analyzer = new PanGuAnalyzer();       //智能分词   盘古分词

原文的 编号  HTML文件  分词结果  保存在索引库中

定时任务

Quartz.Net      

Trigger   定时任务

 

原因:给网友发网址

存在一大堆viewstate 

解决方法:把请求方式改为get  ,把form表单   去掉runat=”server” 把控件都改为客户端控件,repeater等不依赖于viewstate  的控件可以保留

 

原因:智能提示

动态添加 div  ajax异步根据输入内容like查询前几条数据

jQuery UI中有智能提示的方法

 

热词高亮:

 

经常搜索词:原因   不能频繁访问数据库   用数据缓存

 

quartz.net 是一个定时任务框架他非常的灵活

 

 面试问答:介绍一下站内搜索项目。流程、主要技术、工期。写项目的时候可以说成集成搜索和外挂搜索。(简历参考)

流程:(对于外挂搜索)每天通过Quartz.Net安排计划任务自动创建索引(每天两次);用户进入搜索页面,输入关键词进行搜索(用户不必要自己用空格分词,因为我们通过盘古分词算法将用户的输入进行了分词),搜索出来的结果是只显示匹配的部分内容,并且关键词高亮显示;热词显示功能,数据是从用户每次的搜索记录而来,为了降低数据库负载,采用了Cache,每次Cache1小时,这样不用每次都加载数据库(可以说一开始没有加缓存,把数据库压死了,被老板批了一通,后来加了缓存就运行很快了),热词用div+css来实现五栏效果(程序员一条条数据添加div就可以,由CSS控制五栏效果);搜索建议,是AJAX效果,用户搜索的时候自动显示搜索建议,数据也是从用户每次的搜索记录而来,用的是JQueryUIAutocomplete组件,后台编写ashx提供服务器,通讯用json;分页是自己写的分页控件,吹一下自己的分页控件如何的灵活并且不像DataPaer耦合那么紧密(一定要吹得有点激动);三层;ToLower的故事(发现文章中有“C语言”,但是搜不到“C语言”,最后折腾了一晚上查资料,知道盘古分词默认是把字母都变成小写,所以在搜索的时候把关键字ToLower()就搞定了)

可以说是“图书商城的站内搜索模块”

主要技术:Lucene.Net(盘古分词)、Quartz.NetLog4NetAJAXJQuery)、CSS+DivWebClientHTML解析器(mshtml)、自定义分页组件。

工期:1个多月。

引导面试官,把你项目中用的技术、关键技术点都说出来,不让他问别的。比如介绍搜索建议的功能,首先说是用JQueryUI实现的。

Entity.Framework

EFFist        实体优先

//添加

MusicDBEntities musicEn = new MusicDBEntities();

            Artists artist = new Artists();

            artist.Name = "张国朋";

            musicEn.Artists.AddObject(artist);

            musicEn.SaveChanges();

网站优化

数据库优化:

建立索引(经常在where中进行数据过滤得字段中才建索引)

存储过程

缓存:Cache

图片单独域名部署:好处、避免传输无用的Cookie,避免浏览器对于同一域名的并发请求限制

Js、css文件压缩

负载均衡(Load Balance)不同请求发送到不同的服务器 Ngix、F5

分布式缓存 缓存服务器 把所有的缓存放到单独的缓存服务器 memcached做缓存

优化代码:算法优化等等

 

缓存

页面缓存(中庸)、数据源缓存(不灵活)、数据缓存(最灵)

页面缓存(中庸)

<%@ OutputCache Duration="5" VaryByParam="none" %>

<%@ OutputCache Duration="5" VaryByParam="url参数  id;name" %>

文件依赖缓存

依赖文件

System.Web.Caching.CacheDependency cDep = new System.Web.Caching.CacheDependency(path);

依赖数据库

轮转机制

为数据库中的表新建版本表,表的标示码,版本号。为原来的表创建触发器,当发生改变的时候使版本号变化  配置web.config文件

 

依赖于文件内容
CacheDependency cDep = new CacheDependency(filePath);

依赖于数据库内容(轮询机制/通知机制)
一:轮询机制

       1.在数据库新建版本表。2.在数据库新建触发器(比如在新闻表上新建)。
  3.使用C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727中的aspnet_regsql.exe:
  注册:aspnet_regsql -S . -E -ed -d 数据库名 -et -t 版本表名
  删除:aspnet_regsql -S . -E -d 数据库名 -dt -t 版本表名
取消数据库缓存依赖: aspnet_regsql -S . -E -dd 数据库名
数据库名列出已注册表:aspnet_regsql -S . -E -d 数据库名–lt
4.配置web.config(见备注)
5.数据库依赖对象
SqlCacheDependency cDep =  new SqlCacheDependency("GSSMS", "CacheDep");

 

1.依赖于文件System.Web.Caching.CacheDependency cDep = new System.Web.Caching.CacheDependency(filePath);

Cache.Add("fmsg", msg, cDep, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, RemovedCallback);

aspnet_regsql -S . -E(集成登陆)/-U sa -P 123 -ed(启动/-dd关闭) -d(数据库名) GSSMS -et(指定缓存依赖的表名/-dt禁用表名) -t(表名) Aticle
2.依赖于数据库的web.config配置
<system.web>

<caching>

<sqlCacheDependency enabled="true">

<databases>

<add name="GSSMS" connectionStringName="conStr2" pollTime="15000"/>

</databases>

</sqlCacheDependency>

</caching>

 

通知机制

自定义缓存  Cache类的使用

URL重写

继承IHttpModule接口

添加类并继承IHttpModule接口,实现

public void Init(HttpApplication context)

        {

            //添加委托  添加注册事件

            context.BeginRequest += Application_Begin;//调用方法

        }

app.Context.RewritePath("");   ////重写回URL地址

配置web.config文件在<system.web>

 

<httpModules>

        <add name="myModule" type="URL重写.HttpModule,URL重写"/>

      </httpModules>

 

 

新建全局文件 也行

 

站点地图

广告位管理
1.新建数据库   广告位表、广告表

2.添加页面  广告管理页面、 后台实现广告的增删改查 (文字广告、图片广告、代码广告)

3新建一个自定义广告控件

Flush播放

焦点图

实现图片轮转效果

代码调优

代码性能调整这个问题一直以来都是一个富有争议的话题。以前的计算机资源非常有限,代码的效率非常重要,随着电脑硬件的升级,现在随便一只电脑就有上G的内存,cpu性能也提升很大。程序性能与程序的总体设计,算法选择,编译器,运行环境,硬件等有着密切的联系,如果前面的因素都考虑过后,可以考虑对代码进行调优。代码调优是对正确代码进行调整的实践,但是它的问题在于,高效的代码不一定就是“更好”的代码。和代码重构相反的是,代码调优经常会破坏代码的内部结构,以换取性能的提升。性能只是软件整体质量的一个方面,对于桌面应用程序,它通常不是最重要的,相对于代码本身的效率而言,程序的架构,细节设计以及数据结构和算法的选择对程序的运行速度和资源占用的影响会更大。

另外,定量测量是性能优化的关键,只有经过严格的测量才能知道优化是否有效,因为优化结果在不同的语言,编译器和运行环境下有很大差异。如果没有对每一次的优化进行测量,你将无法判断优化到底是帮助还是损害了程序。

下面摘抄了《代码大全2》里面的一个代码调整的核对表:

 

同时改善代码执行速度和规模:

  • 用查询表替换复杂逻辑
  • 合并循环
  • 使用整形变量而非浮点变量
  • 在编译时初始化数据
  • 使用正确的常量类型
  • 预先计算结果
  • 删除公共子表达式
  • 将关键子程序代码转化为某种低级语言代码

仅仅提高代码执行速度

  • 在知道答案后就停止执行判断
  • 根据各种情况的出现频率对case语句和if-then-else串排序
  • 比较相似逻辑结构的性能
  • 使用惰性求值
  • 将循环中的if判断转到外部
  • 展开循环
  • 将循环内部所作的工作减少到最低限度
  • 在查找循环中使用哨兵
  • 把执行最为频繁的循环放在嵌套循环的最里面
  • 减轻内层循环的强度
  • 将多维数组改为一维数组
  • 最大限度减少数组索引
  • 为数据类型扩充索引
  • 对频繁使用的值进行缓存
  • 利用代数恒等式
  • 降低逻辑和数学表达式的强度
  • 注意系统调用
  • 用内联子程序重写代码

Memcached

 

面试技巧

项目收获

弱化流程  突出技术点 注重知识点的详细    重点能简单介绍   有详细描述点   着重介绍自己记忆最深刻的技术部分,最有成就感的部分得分点

思考有哪些方法

项目、功能点要描述:怎么用、为什么、怎么实现、关键技术点

 

技术面: 如果提问的知识点实在不会甚至是没听说过    实话实说反而不错

有印象但不是太深刻  凭记忆稍微描述   其他的就说   网上查的

 

学习途径:

  上课获取相关知识   ,主要是自己课下 或是业余时间在图书馆,项目组组员之间相互讨论。

 

面试前的准备:

首先了解 面试的企业  应征岗位的详细信息  详细背景及其他 客观评价自己是否适合相应的职位,盲目投递耗神费时,不可取。

 

自我介绍:

我是谁  做过什么   做成过什么   想做什么    能做什么

  1. 姓名 年龄  籍贯  等基本信息  教育背景  以及应聘职位相关的特长及爱好
  2. 做过什么 介绍与应聘职位有关的实践经历,包括校内活动 以及相关的兼职等
  3. 你去能干什么   带给企业什么

 

 

待遇问题:

可能与期望值不相符 ,尽可能争取?  因人而异最好   不强求    如果对企业有感觉的话可以降低标准

出差:  距离问题    如果不是太远的话可以接受 ,太远的话   视自己情况而定 (老婆在哪我去哪)

 

posted @ 2013-06-17 11:25  张国朋  阅读(890)  评论(0)    收藏  举报