zoukankan      html  css  js  c++  java
  • ASP.NET的几个试题(《C#与.NET程序员面试宝典》)

     更多参考:博客园笔记

    面试题1ASP.NET是什么

    ASP.NET不是一种语言,而是创建动态Web页的一种强大的服务器端技术,它是Microsoft.NET Framework中一套用于生成Web应用程序和Web服务的技术,,利用公共语言运行时(Common Language Runtime)在服务器后端为用户提供建立强大的企业级Web应用服务的编程框架。

    ASP.NET页在服务器上执行,并生成发送到桌面或浏览器的标记(如 HTMLXML或者WML)。可以使用任何.NET兼容语言(比如Visual BasicC#)编写Web服务文件中的服务器端(而不是客户端)逻辑。ASP.NET页使用一种由事件驱动的、已编译的编程模型,这种模型可以提高性能并支持将用户界面层同应用程序逻辑层相隔离。

     

    面试题2ASP.NETASP的区别是什么

    ASPASP.NET虽然都是微软公司的两项Web技术,但由于它们诞生的时间(1996VS2002)与背景不同,所以它们之间的区别相对比较大,主要区别在开发语言、运行机制、运行环境、开发方式等方面的不同。

    区别如下:

    1)开发语言不同:ASP的开发语言仅局限于使用VBS/JS脚本语言混合html来编程,给客户端脚本添加代码和给页面添加ASP代码的方法是一样的。

    ASP.NET的开发语言更为广泛,可以使用符合.NET Framework规范的任何一种功能完善的strongly-type编程语言(比如Visual BasicC#)。

    2)运行机制不同:ASP是解释型的编程框架,因没有事先编译,而是一边解释一边执行,故而页面的执行效率相对比较低。ASP.NET是编译型的编程框架,服务器上运行的是已经编译好的代码,因此可以利用早期绑定来实时编译,进而提高执行效率。

    3)运行环境不同:ASP的运行环境是Windows操作系统及IISASP.NET的运行环境除了Windows操作系统及IIS,还需要安装.NET Framework

    4)开发方式不同:ASP将用户界面层和应用程序逻辑层的代码混合写在一起,因此在维护和重用方面比较困难。ASP.NET将用户界面层和应用程序逻辑层的代码分离开,程序的复用性和维护性都得到了提高。

    5)诞生的时间不同:199611月,Microsfot公司推出了ASPActive Server Pages)技术。200201月,Microsfot公司推出了ASP.NET技术。

    扩展:

    ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题: 
    1、代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难。 
    2、代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 
    3、弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来会方便一些,但相对于它所造成的出错几率是远远得不偿失的。 
    以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。 

     

    那么,ASP.Net有哪些改进呢? 
    ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++ , VB , JS等等,当然,最合适的编程语言还是MS为.Net Frmaework专门推出的C#(它可以看作是VC和Java的混合体吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性,比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。) 

    ASP(Active Server Pages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码,能产生和执行动态、交互式、高效率的服务器的应用程序。运用ASP可将VBscriptjavascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。此外,它可通过内置的组件实现更强大的功能,如使用ADO可以轻松地访问数据库。 

    之后,微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。 

    面试题3:说明ASP.NETApplication特性

    通常情况下,Application不会被程序员频繁地使用,但在一些特殊场合下Application会被经常地用到。

    Application对象在实际网络开发中的用途就是记录整个网络的信息,在给定的应用程序的多用户之间共享信息,并在服务器运行期间持久的保存数据Application对象具备控制访问应用层数据的方法,并可用于在应用程序启动和停止时触发过程的事件。

    Application具备以下4个特性:

    信息量大小为任意大小

    应用于整个应用程序/所有用户

    保存在服务器端

    作用域和保存时间是在整个应用程序的生命期

    解析:

    Application是用来保存所有用户共用的信息,在ASP时代,如果要保存的数据在应用程序生存期内不会或者很少发生改变,那么使用Application是理想的选择。但是ASP.NET开发环境中,程序员通常把类似的配置数据放在Web.config中。如果要使用Application的话,要注意的是所有的写操作都要在Global.asax文件中的Application_OnStart事件中完成。如以下示例代码所示:

    /*下面的代码在Global.asax文件中设置*/
    Application.Lock();                                            //将Application对象加锁操作。
    Application[“UserID”]=”Hellokitty”;                      //将Hello kitty值赋值给Application[“UserID”]对象
    Application.Unlock();                                          ///将Application对象解锁

    以下示例代码是在页面中调用Application,如下所示:

    /*在Webpage中调用Application对象,请参考下面的用法。*/
    String UserName=Application[“UserID”].ToString()

    注意:尽管可以使用Application.Lock()避免冲突,但是它串行化了对Application的请求,会产生严重的性能瓶颈。因此,仍应尽量避免使用Application保存大数据量信息

     

    如果在应用程序中使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart事件中完成。尽管使用Application.LockApplicaiton.Unlock方法来避免写操作的同步,但是由于它串行化了对Application对象的请求,当网站访问量大的时候会产生严重的性能瓶颈,因此最好不要用此对象保存大的数据集合。下面举一个在线用户统计的例子来说明这个问题:

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Web;
    using System.Web.SessionState;
    using System.IO;
    public class Global :System.Web.HttpApplication                                    // Global 的摘要说明。
    {
             privateSystem.ComponentModel.IContainer components = null;     //必需的设计器变量。
             privateFileStream fStream;
             privateStreamReader reader;                                                                  //读字符流
             privateStreamWriter writer;                                                                    //写字符流
    public Global()
    {
    InitializeComponent();                                                                                //加载组件的已编译的页
    }
    protected void Application_Start(Object sender, EventArgs e)
    {
            Application["CurrentUser"]=0;                                                               //初始化为0
             //文件不存在,创建文件
             fStream =File.Open(Server.MapPath("counts.text"),FileMode.OpenOrCreate);
             reader = newStreamReader(fStream);                                                 //要读取的完整路径
             //从当前流中读取一行字符并将数据作为字符串返回
             Application["AllUser"]= Convert.ToInt32(reader.ReadLine());
            reader.Close();/                                                                                                     //关闭流
    }
    //当用户访问网站时,在线用户+1,总访问数+1
    protected void Session_Start(Object sender, EventArgs e)
    {
            Application.Lock();                                                                                       //同步,避免同时写入
            Application["CurrentUser"]=(int)Application["CurrentUser"]+1;              //总在线用户数
             //访问网站的总用户数
            Application["AllUser"] =(int)Application["AllUser"]+ 1;
             fStream = newFileStream(Server.MapPath("counts.text"),
    FileMode.OpenOrCreate,FileAccess.ReadWrite);
             //实现一个写入流,使其以一种特定的编码向流中写入字符
             writer = newStreamWriter(fStream);
             //把访问网站的总用户数再次写入到文件
            writer.WriteLine(Application["AllUser"].ToString());
            writer.Close();                                                                                               //关闭写入流
            Application.UnLock();                                                                                 //同步结束
    }
    //当前用户退出网站时,在线用户数量-1
    protected void Session_End(Object sender, EventArgs e)
    {
            Application.Lock();
            Application["CurrentUser"] =(int)Application["CurrentUser"]- 1;       //总在线用户数量-1
            Application.UnLock();
    }
    WebPage.ASPX页面的示例代码如下:
    private void Page_Load(object sender, System.EventArgs e)
    {
            this.Label1.Text = "当前站点的用户数:" +Application["CurrentUser"].ToString();
             this.Label2.Text="访问过站点的总用户数:" +Application["AllUser"].ToString();
    }
    View Code

    面试题4 简述ASP.NET的页面运行机制

    在深入学习ASP.NET之前,首先需要先了解一下ASP.NET的基本运行机制。

    1)当第一次访问页面时,页面请求首先依次经过HttpModulsHttpHandler(处理程序)的处理,服务器接收到HttpHandler的请求后将跳转到需要访问的页面,然后ASP.NET Engine负责找到这个页面后台的类,并实例化为一个临时对象,在此过程中会触发一系列的事件,其中一部分事件需要经过对象中的方法进行处理,之后服务器会将这个处理后页面移交给Response对象,然后由Response对象将这个页面发送到客户端。这就是第一条路线。

    2)因为服务器之间的会话已经建立,在服务器中的临时对象已经建立,所以在这个页面上重新提交一些信息并再次向服务器发送请求时,是不用再经过初始化页面这一部分工作的。故这第二条路线是依次提交HttpModulsHttpHandler请求,然后直接与临时对象交互并返回的。

    3)第三条路线与第二条路线的不同之处在于,在处理请求时,如果涉及到需要调用ASP.NET Cache(既ASP.NET缓存),临时对象将直接从ASP.NET缓存提取信息并返回。

    4)第四条路线是在刷新页面的时候,服务器接收到并发现这个请求先前曾经处理过,并将处理结果存储到由一个默认的HttpModule管理的输出缓存中,那么此时就可以直接从这个缓存中提取信息并返回,而无需再重新处理一遍。

    【答案】

    当每次请求ASP.NET页面时,依据不同的情况浏览器、服务器、ASP.NET引擎之间将执行这四条路线中的一条路线,通过了解ASP.NET页面的内部运行机制,程序员可以在编写、调试代码的时候会更加游刃有余的。

    面试题5:简述ASP.NET一个页面的生命周期

    【考题分析】

    在学习ASP.NET页面生命周期前,需要先了解上一小节介绍的 ASP.NET的基本运行机制。

    页面从创建到处理结束的过程中  ASP.NET Engine执行的11个事件。

    【答案】

    ASP.NET页面生命周期中需要经历Page_InitLoadViewStateLoadPostDataPage_LoadRaisePostDataChangedRaisePostBackEventPage_PreRenderSaveViewStatePage_RenderHandleUnLoad这十个事件。每次ASP.NET页面请求,都经历着同样的过程:从初始化对象到销毁对象。通过了解ASP.NET页面页面生命周期程序员可以在编写、调试代码的时候会更好地把握这些事件之间的关系。

    ASP.NET中服务器控件的生命周期

    ASP.NET页生命周期概述


    书籍:C#与.NET程序员面试宝典 

  • 相关阅读:
    LeetCode.1(两数之和)
    LeetCode.56(合并区间)
    c++ 数字与字符串的相互转换
    软件工程作业-面向对象方法学
    linux终端下解决you need to be root to perform this command
    vue中 v-bind 与 v-model的区别
    vue的核心:虚拟DOM 和 diff 算法
    弱实体集的必要性、属性随笔
    Ubuntu 18.04下Intel SGX应用程序程序开发——获得OCALL调用的返回值
    Ubuntu 18.04 INTEL SGX 修改案例打印Hello Enclave
  • 原文地址:https://www.cnblogs.com/peterYong/p/6556586.html
Copyright © 2011-2022 走看看