.NET面试题 – ASP.NET开发人员

本文大部分问题分析来源自网络,加上部分个人的部分。所有引用表明出处,或直接以网址形式给出。如有不正确支持望及时指出!谢谢!

ASP.NET(UI)开发人员

  1. 阐述一个基于浏览器的Form POST如何变成一个服务器端的事件,如Button1_OnClick。

    对于这个问题看Artech大哥的此文http://www.cnblogs.com/artech/archive/2007/04/06/702658.html足以

  2. 什么是PostBack?

    PostBack即回发,也就是服务器重新生成一次页面并发送给客户端的过程。此处推荐篇阿不同志的文章http://www.cnblogs.com/hjf1223/archive/2008/01/03/1024969.html

  3. 什么是ViewState? 它是否被编码过? 是否被加密过?谁会使用ViewState?

    ViewState是用来在PostBack之间保存信息的工具。这些信息被保存在页面的一个hidden元素中。默认情况下ViewState采用了Base64来编码。所以安全性上存在一定问题。要保护viewstate有两种方式: 一种是防篡改,一种是加密. 一说到防篡改,我们就想起了使用散列代码. 没错, 我们可以在页面顶部加入如下代码:Page EnableViewStateMAC=true。默认情况下asp.net是通过SHA1算法而不是md5算法来生成散列,不过这个可以在machine.config里面配置machineKey validation="MD5"即可。viewstate加密, 只要在machine.config里设置一下machineKey validation="3DES"即可实现用des加密viewstate了。

    像是控件在两次回发之间就需要ViewState来保存状态值,如文本框中的值等。

  4. <machinekey>元素是干嘛用的?它用于哪两项ASP.NET技术?

    machineKey的作用在于下述场景:

    ASP.net 使用 forms authentication 时的 cookie 数据的加密和解密。以确保这部分数据不会被篡改。

    viewstate 数据的加密和解密。以确保这部分数据不会被篡改。

    使用进程外session(out-of-process session)时,对会话状态标识进行验证。

    摘自蝈蝈俊的文章http://blog.joycode.com/ghj/archive/2009/03/18/115516.joy

  5. 说出ASP.NET 1.1中的3种Session State提供程序以及它们的优缺点?

    Process - 进程内。速度比较快,但比较难适应大型应用。

    ASP.NET State Service – ASP.NET状态服务。速度,容量上折中。如果使用专用的状态服务器则可以扩展。

    SQL Server Session State Management:速度较慢。但可靠性是最强的。而且也有很高的扩展性,适合大型应用。

  6. 什么叫Web Gardening? 在设计中如何使用它?

    Web Gardening又称Web园,(注意这与Web Farm即Web场不是一个概念。)Web 园是在单台服务器上通过为应用程序池指定多个工作进程而配置的。而 Web 场则是针对某个网站使用多个服务器。以下对Web园的概念及使用方法的描述引用自TechNet:

    Web园定义

    在 IIS 6.0 工作进程隔离模式下,应用程序池通过隔离应用程序与服务于这些应用程序的工作进程来提高网站或应用程序的可靠性。如果要获得更高的可靠性,可以将应用程序池配置为由多个工作进程支持。使用多个工作进程的应用程序池称为"Web 园"。Web 园中的工作进程将共享到达该特定应用程序池的请求。如果一个工作进程失败,另一个工作进程可以继续处理请求。

     

    Web园对网站的增强作用

    可靠的请求处理:当应用程序池中的某个工作进程停止处理时(例如,当脚本引擎停止响应时),其他工作进程可以接受并处理该应用程序池的请求。

    • 减少了资源争用:当 Web 园达到稳定状态时,按照循环方案每个新 TCP/IP 连接将分配给 Web 园中的一个工作进程。这可以产生平衡工作负荷和减少绑定到工作进程的资源争用的效果。

     

    配置 Web 园 - 使用 IIS 管理器(此处只附上这一种配置方法)

    1. 使用管理员账户运行IIS管理器。在 IIS 管理器中,依次展开本地计算机和"应用程序池",右键单击该应用程序池,然后单击"属性"。

    2. 单击"性能"选项卡,然后在"Web 园"下的"最大工作进程数"框中,键入要向应用程序池指定的工作进程数。(要形成 Web 园,必须为应用程序池键入一个大于 1 的数值。)

    3. 单击"确定"。

     

  7. 假设有一个ASP.NET应用程序,那么单独一个进程中允许多少应用程序对象?那两个进程呢?启用了Web Gardening的2个进程呢?这对设计有何影响?

    一个进程中可以运行一个应用程序池,一个应用程序池可以运行多个应用程序对象,所以单独一个进程中应该可以允许多个应用程序对象。再不配置Web Gardening的情况下一个进程中只能运行一个应用程序池。则两个进程运行两个应用程序池。当配置Web Gardenning后一个应用程序池可以运行在两个或两个以上的进程中。所带来的好处可以见第6问的分析。

  8. ASP.NET会重用多个请求之间的线程吗?是否每个HttpRequest都有自己的线程?你是否应该用ASP.NET的Thread Local存储?

    当有一个耗时较长的操作需要通过异步方式完成时,可以使用ThreadPool利用线程池中的线程来一步进行这个操作。这时线程是可以重用的。每个HttpRequest应该都有自己的线程。另外关于Thread Local存储没有搜到与.net相关的内容。不过顾名思义-线程本地存储应该就是与一个线程相关的变量的存储。参考网上文章所提到的静态方法中用到的静态变量在多线程中会出问题这种说法,个人感觉Thread Local存储可以在一定情况下解决这个问题。

  9. [ThreadStatic]属性在ASP.NET中有用吗?它有没有副作用?是好是坏?

    [ThreadStatic]也可以解决上文上文提到的,静态方法中的静态变量在多线程环境中会出问题的情况。只需要将这些静态变量标记为[ThreadStatic]即可。[ThreadStatic]特性即是可使变量线程唯一。至于副作用,有文章说[ThreadStatic]不是很稳定,在解决此类问题的最好的方法是使用Context Provider来存取与线程相关的数据。关于Context的使用可以参见这篇文章。http://www.cnblogs.com/vwxyzh/archive/2009/02/21/1395416.html

  10. 如何使用HttpHandler简化现有的为.aspx页面提供验证图片的设计 。

    张子阳的这篇文章很好的介绍了这一过程,我就不多废话了,直接上网址。http://www.tracefact.net/Asp-Net/Introduction-to-Http-Handler.aspx

  11. HttpModule订阅的是什么类型的事件? 这对于实现有何影响?如果不打算重新编译ASP.NET应用程序,应该怎么做?

    HttpModule通过对HttpApplication对象的一系列事件的处理来对HTTP处理管道施加影响,这些事件在HttpModule的Init方法中进行注册,包括:

    BeginRequest

    AuthenticateRequest

    AuthorizeRequest

    ResolveRequestCache

    AcquireRequestState

    PreRequestHandlerExecute

    PostRequestHandlerExecute

    ReleaseRequestState

    UpdateRequestCache

    EndRequest

    后两问实在不知原题何意,有待高手出来解答。

     

  12. 说出表示任意一个终端(URL)的方式,以及ASP.NET中把请求路由到那个终点的方式

    基本上路由一个url的方式是,首先获取请求的url,然后分析,匹配一定规则的话则路由到一个指定的新url。这个过程可以在Global.asax的Application_Start事件处理或自定义的IHttpMoudle的 Application_BeginRequest时间处理函数中完成。可以参看这篇文章,小示例很不错。

    http://niunan.javaeye.com/blog/460681

  13. 解释cookie的工作原理。给出一个滥用Cookie的例子。

    Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息。 如果用户再次访问站点上的页面,如当该用户输入URL:www.cnblogs.com时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到您的站点。

    Cookie最根本的用途是:Cookie 能够帮助 Web 站点保存有关访问者的信息。更概括地说,Cookie 是一种保持Web 应用程序连续性(即执行"状态管理")的方法.使 Web 站点记住您。

    滥用的例子还未发现,但是根据其原理可以看出Cookie需要在Browser与Server间传递的特性决定了其不适合填充太多的内容。

  14. 解释HttpRequest.ValidateInput()的重要性?

    HttpRequest 类使用输入验证标志来跟踪是否对通过 Cookies、 Form 和 QueryString 属性访问的请求集合执行验证。ValidateInput 方法设置这些标志,以便在调用 Cookies、 Form 或 QueryString 属性的 get 访问器时执行输入验证。验证的工作原理是,将所有输入数据与具有潜在危险的数据的硬编码列表进行对照检查。

    如果页指令或配置启用了验证功能,则在页的 ProcessRequest 处理阶段调用此方法。如果未启用验证功能,则可通过代码调用 ValidateInput 方法。

    对此的重要性还没有很深的体会。请高手指点。

  15. 哪些数据是通过HTTP Header传递的?

    HTTP的头域包括通用头,请求头,响应头和实体头四个部分。

    通用头常见的如:Cache-Control头域:Cache-Control指定请求和响应遵循的缓存机制。Date头域:Date头域表示消息发送的时间,时间的描述格式由rfc822定义。Pragma头域:Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。

    请求消息:请求消息如OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等。

    响应消息:主要有5类,1xx:信息响应类,表示接收到请求并且继续处理。2xx:处理成功响应类,表示动作被成功接收、理解和接受。3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理。4xx:客户端错误,客户请求包含语法错误或者是不能正确执行。5xx:服务端错误,服务器不能正确执行一个正确的请求。

    实体:包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。

  16. 对比HTTP动词GET和POST? 什么是HEAD?

    HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和 幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解); 
    在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为"+"号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
    GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

    以上内容摘自:http://www.cnblogs.com/stu-acer/archive/2006/08/28/488802.html

    目前从实际应用来看GET与POST的区别没有那么明显。

    HEAD动词用于请求页面的首部,貌似不常用。

  17. 说出至少6个HTTP状态码以及它们的含义

    列举几个常用的:

    200 OK / 400 Bad Request / 403 Forbidden / 404 Not Found / 500 Internal Server Error / 504 Gateway Timeout

  18. if-not-modified-since的工作原理是什么? 用ASP.NET如何实现它?

    待高手解答。

  19. 解释 <@OutputCache%>和如何使用VaryByParam、VaryByHeader.

    @ OutputCache 指令用来以声明方式设置 ASP.NET 页的缓存,它的常用属性如下:
    Duration:设置缓存到期时间,单位:秒。
    VaryByParam:可用来使缓存输出因查询字符串而异,多个查询字符用分号隔开。
    VaryByControl:可用来使缓存输出因控件值而异。
    VaryByHeader:可用来使缓存输出因请求的 HTTP 标头而异。
    VaryByCustom:可用来使缓存输出因浏览器类型或您定义的自定义字符串而异。
    CacheProfile:结合配置文件使用。
    Location:设置页的可缓存性,值有Any,Client,Downstream,None,Server,ServerAndClient。

    例如:

    <%@ OutputCache Duration="" VaryByParam="" VaryByControl="" VaryByHeader="" VaryByCustom="" CacheProfile="" Location="" %>

    其必备的两个属性为Duration与VaryByParam,如果不需要指定VaryByParam,则将值设置为None。

  20. VaryByCustom是如何工作的?

    VaryByCustom,我们可以自定义输出缓存要求的任意文本。除了在OutputCache指令里面申明该属性之外,我们还得在应用程序的 global.asax 文件的代码声明块中,重写GetVaryByCustomString 方法来为自定义字符串指定输出缓存的行为。

    举例例下:

    <%@ OutputCache VaryByParam="none" VaryByCustom="CategoryPageKey" Location="server" Duration="43200" %>

    这里的VaryByCustom定义的为CategoryPageKey,那么在global.asax里面我们必须定义CategoryPageKey这个字符创输出缓存的行为,见下面代码。

    public override string GetVaryByCustomString(HttpContext context, String arg)

    {}

    主要引自此文,更多详细信息也请参见此文http://www.cnblogs.com/leonjoon/archive/2006/08/27/487747.html

  21. 如何通过q=? (除了q=5)来实现ASP.NET HTML输出缓冲和缓冲过期(比如http://localhost/page.aspx?q=5)?

    待高手解答。

原文地址:https://www.cnblogs.com/lsxqw2004/p/1572658.html