转:http://blog.163.com/kele_lipeng/blog/static/81345278201132754729336/

作者:朱先忠

本文将接着上一篇 ASP.NET4与VS2010Web开发核心服务改进 继续讨论核心ASP.NET服务方面的改进。

四、永久重定向页面

一种常见的Web应用程序做法是,随着时间的推移经常移动网页和其他内容,从而导致搜索引擎失效链接的积累。在ASP.NET中,开发商通常采用的处理旧网址请求的方案是,使用 Response.Redirect方法把对旧网址的请求转发到新网址。然而,当用户尝试访问的旧网址时,使用Redirect方法会导致一个“HTTP 302 Found”(临时重定向)响应,从而相应地产生一次额外的HTTP往返。

ASP.NET 4增加了一个新的RedirectPermanent辅助方法,可以方便地发出“HTTP 301 Moved Permanently”响应,如下面的例子所示:

RedirectPermanent("/newpath/foroldcontent.aspx");

搜索引擎及其他识别永久重定向的用户代理程序都将会存储起与此内容相关的新的网址,从而消除不必要的因临时重定向导致的HTTP往返。

五、极具伸缩性的会话状态管理

ASP.NET针对在Web场中存储会话状态提供了两个默认选项:一个调用进程外会话状态服务器的会话状态提供程序,和一个能够把数据存储在Microsoft SQL Server数据库中的会话状态提供程序。由于这两个选项都牵涉到在Web应用程序的工作进程外存储状态信息,所以,在把会话状态发送到远程存储之前必须把它序列化。根据开发者在会话状态中保存信息的多少,序列化数据的尺寸可能增长到相当大。

ASP.NET 4引入了一个针对两种进程外会话状态提供程序的新的压缩选项。当显示在下面的示例中的compressionEnabled配置选项被设置为true时,ASP.NET将会使用.NET框架的System.IO.Compression.GZipStream类来压缩(和解压)序列化的会话状态。

<sessionState
  mode="SqlServer"
  sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate"
  allowCustomSqlDatabase="true"
  compressionEnabled="true"
/>

通过把此新的属性简单地添加到Web.config文件中,在Web服务器中具有空闲的CPU周期的应用程序便可以实现大幅度地减小序列化的会话状态数据的大小。

六、扩展URL最大长度

ASP.NET 4引入了新的选择用于扩展应用程序URL的规模。早期版本的ASP.NET把URL路径的长度限制为最长260个字符(基于NTFS文件路径限制)。在ASP.NET 4中,您可以选择增加(或减少)这个数目以便更适合于你的应用程序,这是使用两个新的httpRuntime配置属性实现的。下面的例子显示了这些新的属性的使用。

<httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" />

为了使用更长或更短的路径(不包括协议、服务器名称和查询字符串的URL中的部分),你可以修改maxRequestPathLength属性的值。为了使用更长或更短的查询字符串,你可以修改maxQueryStringLength属性的值。

在ASP.NET 4中,您还可以配置由URL字符检查机制所使用的字符。当ASP.NET查找到一个URL路径中的无效字符时,它将拒绝该请求,并发出一个HTTP 400错误。在以前版本的ASP.NET中,URL字符检查仅限于一个固定的字符集。在ASP.NET 4,您可以自定义一个有效的字符集,这可以通过使用HttpRuntime配置元素中新的requestPathInvalidChars属性实现,如下面的示例所示:

<httpRuntime requestPathInvalidChars="<,>,*,%,&,:,\" />

默认情况下,requestPathInvalidChars属性定义7个无效的字符。(默认情况下,在分配给requestPathInvalidChars的字符串中,小于号(“<”),大于号(“<”)和符号&都被进行编码,因为文件Web.config是一个XML文件。)您可以根据需要自定义设置无效的字符。

【注意】ASP.NET 4始终会拒绝包含在0x00~0x1F范围的ASCII字符的URL路径,因为这些都是IETF的RFC 2396文件中所规定驱动的无效的URL字符。在运行6.0或更高的IIS的Windows 版本中,Http.sys协议设备程序会自动拒绝其中包含这些字符的URL。

七、可扩展请求校验

ASP.NET请求验证机制会搜索传入的HTTP请求数据中的通常用在跨站点脚本(XSS)攻击中的字符串。如果发现存在潜在的XSS字符串,请求验证将会标志出被怀疑的字符串并返回一个错误。内置的请求验证只有当发现最常见的跨站脚本攻击中使用的字符串时才返回一个错误。以前的XSS验证过于积极,从而导致许多的误判。不过,有时候用户的确可能会请求一个具有攻击意味的验证,但也有可能想有意放宽对特定的网页或特定类型请求的跨站脚本检查。

在ASP.NET 4中,对请求验证功能进行了扩展,以便您可以使用自定义的请求验证逻辑。为了扩展请求验证,你可以从新的System.Web.Util.RequestValidator类派生一个类,并配置应用程序(在Web.config文件的httpRuntime节中)以使用你的自定义类型。下面的示例显示了如何配置一个自定义的请求验证类:

<httpRuntime requestValidationType="Samples.MyValidator, Samples" />

注意,这个新的requestValidationType属性要求使用一个标准的.NET Framework类型标识符字符串来指定提供定制请求验证的类。对于每个请求,ASP.NET调用自定义类型来处理每一个传入的HTTP请求数据块。通过下面给出的例子中的自定义的请求验证类,传入的网址、所有的HTTP头部(包括cookie和自定义头部)和整个实体部分都可以被检查:

public class CustomRequestValidation : RequestValidator
{
  protected override bool IsValidRequestString(
      HttpContext context, string value,
      RequestValidationSource requestValidationSource,
      string collectionKey,
      out int validationFailureIndex)
    {...}
}

对于您不希望检查的传入的HTTP数据的情况,请求验证类可以退让给ASP.NET的默认请求验证部分—这是通过简单地调用base.IsValidRequestString实现的。

八、对象缓存和对象缓存扩展

自第一个版本发行以来,ASP.NET提供了一个功能强大的内存对象缓存(System.Web.Caching.Cache)。缓存应用非常受欢迎,即使在非Web应用程序中也被广泛应用。但是,仅为了能够使用ASP.NET对象缓存而在一个Windows窗体或WPF应用程序中包括对于System.Web.dll程序集的引用这真是一件令人尴尬的事情。

为了使所有应用程序都能够利用缓存,.NET Framework 4引入了一个新的程序集,一个新的命名空间,一些基本类型和一个具体的缓存实现。新程序集System.Runtime.Caching.dll中在System.Runtime.Caching命名空间中包含了一个新的缓存API。该命名空间包含了两个核心的类集:

? 为定制缓存实现提供了一些具备基本功能的抽象类型。

? 提供了一个具体的内存对象缓存实现(即System.Runtime.Caching.MemoryCache类)。

新的MemoryCache类的建模方式极类似于ASP.NET缓存,其中使用了相当部分的ASP.NET中的内部缓引擎逻辑。虽然已经更新System.Runtime.Caching中的公共缓存API以支持开发自定义缓存,但是如果您使用ASP.NET Cache对象的话,那么你在使用新的API过程中会发现许多熟悉的概念。

要深入讨论新的MemoryCache类和相应的基本支持API,你需要参考其他更完整的文档。但是,下面的例子让你对新的缓存API的使用方式有一个大致的了解。注意,这个例子是一个Windows窗体应用程序的一部分,其中并没有依赖于System.Web.dll程序集。

private void btnGet_Click(object sender, EventArgs e)
{
  //Obtain a reference to the default MemoryCache instance.
  //Note that you can create multiple MemoryCache(s) inside
  //of a single application.
  ObjectCache cache = MemoryCache.Default;
  //In this example the cache is storing the contents of a file string 
  fileContents = cache["filecontents"] as string;
  //If the file contents are not currently in the cache, then 
  //the contents are read from disk and placed in the cache.
  if (fileContents == null)
  {
    //A CacheItemPolicy object holds all the pieces of cache
    //dependency and cache expiration metadata related to a single 
    //cache entry.
    CacheItemPolicy policy = new CacheItemPolicy();
    //Build up the information necessary to create a file dependency.
    //In this case we just need the file path of the file on disk.
    List<string> filePaths = new List<string>();
    filePaths.Add("c:\\data.txt");
    //In the new cache API, dependencies are called "change monitors".
    //For this example we want the cache entry to be automatically expired
    //if the contents on disk change. A HostFileChangeMonitor provides
    //this functionality.
    policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
    //Fetch the file's contents 
    fileContents = File.ReadAllText("c:\\data.txt");
    //And then store the file's contents in the cache 
    cache.Set("filecontents", fileContents, policy);
  }
  MessageBox.Show(fileContents);
}

九、可扩展的HTML、URL和HTTP头部编码

在ASP.NET 4中,您可以针对常见的文本编码任务,例如HTML编码,URL编码、HTML属性编码和输出的HTTP头部编码等,创建自定义编码例程。您可以通过从新的System.Web.Util.HttpEncoder类型中进行派生来创建定制的编码器,然后配置ASP.NET以便在配置文件Web.config的httpRuntime节中使用该定制类型,如下面的示例所示:

<httpRuntime encoderType="Samples.MyCustomEncoder, Samples" />

配置好自定义编码器后,当调用System.Web.HttpUtility或System.Web.HttpServerUtility类的公共方法时ASP.NET会自动调用此自定义的编码实现。这样一来,可以让Web开发团队的一部分开发定制的字符编码器,而Web开发团队的其他成员继续使用公共的ASP.NET编码API。通过在httpRuntime元素中集中配置自定义编码器,您可以确保从公共的ASP.NET编码API中对所有文本编码的调用都要路由到你的自定义编码器。

十、在单个工作进程中对个体应用程序进行性能监控

为了增加宿主在一台服务器上的网站的数目,许多托管机构都选择在一个工作进程中运行多个ASP.NET应用程序。但是,如果多个应用程序使用一个共享的工作进程,服务器管理员很难确定出现问题的个体应用程序。

如今ASP.NET 4中可以利用新的由CLR推出的资源监测功能。要启用此功能,您可以在Aspnet.config配置文件中添加下面的XML配置片断。

<?xml version="1.0" encoding="UTF-8" ?> 
<configuration> 
  <runtime> 
    <appDomainResourceMonitoring enabled="true"/> 
  </runtime> 
</configuration>

【注意】这个Aspnet.config文件位于NET Framework安装目录下,不同于Web.config文件。

当启用appDomainResourceMonitoring功能后,可以在“ASP.NET应用程序”性能类别中看到有两个新的性能计数器可用:托管处理器时间(Managed Processor Time)和托管使用的内存(Managed Memory Used)。这两个性能计数器都会使用新的CLR应用程序域的资源管理功能来跟踪估计个体ASP.NET应用程序的CPU时间和托管内存利用情况。因此,通过使用ASP.NET 4,管理员现在可以更准确地估计运行于单个工作进程中的个体应用程序消费的资源情况。

十一、多目标平台开发

您可以创建一个运行于特定版本的.NET框架上的应用程序。在ASP.NET 4中,在Web.config文件的compilation元素有一个新属性可以让你的程序的运行平台针对.NET框架4和更高版本。如果你明确你的程序的运行目标是.NET框架4,并且如果您在Web.config文件中包括了一些可选元素,如system.codedom入口等,那么这些元素都必须适合于.NET框架4才行。(如果你没有明确指出你的程序的运行目标,那么系统将通过Web.config文件中的未提供的项进行自行推断。)

下面的例子显示了在Web.config文件的compilation元素的targetFramework属性的使用方式。

<compilation targetFramework="4.0"/>

另外,请注意如下的一些关于配置你的应用程序运行于.NET Framework特定版本方面的描述:

? 在一个.NET Framework 4应用程序池中,如果文件Web.config中不包含targetFramework属性或者如果丢失文件Web.config的话,ASP.NET构建系统总是假定.NET Framework 4为运行目标平台。(为了使你的程序运行于.NET框架4上,你很可能需要对你的代码进行一些修改。)

? 如果你确实包含了targetFramework属性,并且如果在文件Web.config中定义了system.codeDom元素,那么这个文件必须要包含针对.NET框架4的正确的入口。

? 如果你在使用aspnet_compiler命令预编译你的应用程序(例如一个构建环境),那么你必须使用针对目标框架的正确版本的aspnet_compile命令。你可以使用随同.NET Framework 2.0 (%WINDIR%\Microsoft.NET\Framework\v2.0.50727)一同发布的编译器针对.NET框架3.5或更早的版本进行编译。你还可以使用随同.NET Framework 4一同发布的编译器来编译使用这个新框架及以后更新的框架的应用程序。

? 在运行时,编译器将使用安装在本机上的最新的框架程序集(因此它们都应当位于GAC中)。如果以后对框架进行了更新(例如,假定安装了一个4.1版本),那么你将能够使用新版本框架中的特性,即使你设置的targetFramework属性是针对一个低版本的框架(例如4.0)。(但是,在VS2010中在设计时或当你使用aspnet_compiler命令时,使用框架的更新的特性将导致编译时错误)。

ASP.NET4 与 VS2010 Web 开发页面服务改进的更多相关文章

  1. 基于gin的golang web开发:服务间调用

    微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...

  2. 移动web开发—页面头部 META 总结

    meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. 标签位于文档的头部,不包含任何内容. 标签的属性定义了与文档相关联的名称/值对. ...

  3. firfox 和 chrome 移动端Web开发页面调试

    Firefox浏览: 1."Alt+t" 选择工具栏中的“工具”>Web开发者工具>查看器>点击红框所指的地方 或者 F12 [当然这个歌前提是你没有安装fire ...

  4. Springboot 系列(五)Spring Boot web 开发之静态资源和模版引擎

    前言 Spring Boot 天生的适合 web 应用开发,它可以快速的嵌入 Tomcat, Jetty 或 Netty 用于包含一个 HTTP 服务器.且开发十分简单,只需要引入 web 开发所需的 ...

  5. ASP.NET4.5Web API及非同步程序开发系列(2)

    认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP.NET WEB API,ASP.NET Web API ...

  6. ASP.NET4.5Web API及非同步程序开发系列

    ASP.NET4.5Web API及非同步程序开发系列 认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP ...

  7. 在ASP.NET Core中使用Apworks快速开发数据服务

    不少关注我博客的朋友都知道我在2009年左右开发过一个名为Apworks的企业级应用程序开发框架,旨在为分布式企业系统软件开发提供面向领域驱动(DDD)的框架级别的解决方案,并对多种系统架构风格提供支 ...

  8. [web开发] php优势 - PHP与ASP.NET的比较

    php 优势 - PHP与ASP.NET的比较 如今当提到 Web 开发时,您有许多选择.这些方法中许多都涉及到预处理 — 即,利用特定的标记将代码嵌入到 HTML 页面中,这些标记告诉预处理器,它们 ...

  9. ASP.NET Web开发技术的深入总结

    [IT168技术]在国内.Net开发这个环境里, 中小型公司.或者大公司但主营业务不是软件开发里面的软件小团队.针对.Net开发者的要求都是十项全能型的全才, 能做的了从前台页面展现到最后数据存储的全 ...

随机推荐

  1. 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

    数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...

  2. mybatis之高级结果映射

    先贴一句官方文档内容 如果世界总是这么简单就好了. 正如官方文档所说:如果一切都是这么简单,那该多好啊,但是实际上,我们面对的是复杂的对象,就是对象里有对象,有列表对象,总之五花八门的对象.这个时候我 ...

  3. [Win10应用开发] 如何使用Windows通知

    消息通知,是一个应用中必不可少的组成部分.Win10下提供了多种消息通知机制,Toast通知只是其中一种.这篇博文和大家分享一下,如何使用Toast通知. 上图是一个基本的Toast通知,那我们该如何 ...

  4. 如何给RecyclerView加上滚动条--现在就教你

    时隔许久,我又要更博了,含蓄的话不多说了,今天我们的主题是这个RecyclerView.至于为什么要加个scrollBar?因为我的业务需求是需要一个实现成这样的, 效果图:(可能看起来比较粗糙,但功 ...

  5. 在HTML5中如何提高网站前端性能

    1.    用web storage替换cookiesCookie最大的问题是每次都会跟在请求后面.在HTML5中,用sessionStorage和localStorage把用户数据直接在客户端,这样 ...

  6. Java 还是 C++?

    Java 特别象 C++:由此很自然地会得出一个结论:C++似乎会被Java 取代.但我对这个逻辑存有一些疑问. 无论如何,C++仍有一些特性是Java 没有的.而且尽管已有大量保证,声称Java有一 ...

  7. 【SR】Example-based

    基于学习(Example-based)的超分辨率重建算法正则化超分辨率图像重建算法研究

  8. Python_selenium之获取页面上的全部邮箱

    Python_selenium之获取页面上的全部邮箱 一.思路拆分 获取网页(这里以百度的“联系我们”为例),网址http://home.baidu.com/contact.html 获取页面的全部内 ...

  9. Lumen 队列

    队列 简介 连接 Vs. 队列 驱动的必要设置 创建任务类 生成任务类 任务类结构 分发任务 延迟分发 任务链 自定义队列 & 连接 指定任务最大尝试次数 / 超时值 频率限制 错误处理 运行 ...

  10. 下载VMware

    1.进入VMware官网:http://www.vmware.com/cn 2.找到下载,点击Workstation Pro,此时需要账号登录. 3.选择需要下载的版本.对应的操作系统,点击转至下载