ASP.NET 2.0 中的新增服务、控件与功能概述(四)

原文出自http://blog.sina.com.cn/s/blog_48b6cd65010004fc.html

个性化

    另一个新增的服务是个性化,它提供了一种现成的解决方案,用于解决存储站点用户的个性化设置问题。目前,此类设置通常存储在Cookie、后端数据库或这两者中。无论这些设置存储在何处,ASP.NET 1.x都不能提供什么帮助。这需要由您来设置和管理后端数据存储,以及使用经过身份验证的用户名、Cookie或其他某种机制来关联个性化数据。

    ASP.NET 2.0个性化服务使得存储各个用户的设置以及随意检索这些设置变得非常容易。该服务基于用户配置文件—您可以使用新的元素在Web.config中予以定义。下面的代码节选自Web.config:

<profile>
    <properties>
        <add name="Theme" />
        <add name="Birthday" Type="System.DateTime" />
        <add name="LoginCount" Type="System.Int32" defaultValue="0" />
    </properties>
</profile>

    它定义了一个包含三个属性的配置文件:一个名为Theme的字符串,一个名为Birthday的DateTime值,以及一个名为LoginCount的整数。后面这个属性被赋予默认值0。

    在运行时,您可以使用页面的Profile属性(该属性引用包含该配置文件中定义的属性的动态编译类的实例)来访问当前用户的这些属性。例如,下列语句可从当前用户的配置文件中读取属性值:

string theme = Profile.Theme;
DateTime birthday = Profile.Birthday;
int logins = Profile.LoginCount;

    还可以将值赋予配置文件属性:

Profile.Theme = "SmokeAndGlass";
Profile.Birthday = new DateTime (1959, 9, 30);
Profile.LoginCount = Profile.LoginCount + 1;

    个性化服务的一个明显优势是强类型化。另一个优势在于个性化数据是按需读写的。请将此与会话状态(无论是否使用,都会将其加载并保存到每个请求中)进行对比。但是,个性化服务的最大优势可能在于您不必显式地将数据存储在任何位置;系统会替您完成该工作,并且它会永久性地存储数据,以便数据在您需要时随时可用。配置文件不会像会话那样超时。

    那么,个性化数据存储在哪里呢?这要依具体情况而定。个性化服务基于提供程序,因此您可以将其配置为使用任何可用的提供程序。ASP.NET 2.0将至少附带两个个性化提供程序:一个用于Access,另一个用于SQL Server。如果您不另行指定,则个性化服务将使用Access提供程序,默认情况下,该提供程序会将个性化数据存储在本地Data\AspNetDB.mdb中。您可以通过修改Web.config(手动或使用Webadmin.axd)来改用SQL Server数据库。如果您不希望将个性化数据存储在Access数据库或SQL Server数据库中,则可以编写自己的提供程序。

    默认情况下,ASP.NET使用经过身份验证的用户名作为所存储的个性化数据的键,但您也可以将其配置为支持匿名用户。首先,通过将以下语句添加到Web.config中来启用匿名标识:

<anonymousIdentification enabled="true" />

    然后,将allowAnonymous="true"添加到您要为匿名用户存储的配置文件属性中:

<name="Theme" allowAnonymous="true" />

    现在,Theme属性可以作为个性化设置使用,而无论站点的调用方是否经过了身份验证。

    默认情况下,匿名标识使用Cookie来标识回返用户。由支持的属性可以用各种方式来配置这些Cookie。例如,您可以指定Cookie名称,并指明是否应该将该Cookie的内容加密。您还可以将个性化服务配置为使用无Cookie的匿名标识,因此它将依靠URL Munging来标识回返用户。甚至还存在一个自动检测选项:如果请求浏览器支持Cookie,则使用Cookie;如果不支持,则使用URL Munging。

    要查看个性化的工作方式,请运行本文随附的下载资料中的Personalize.aspx示例。它会让站点的每个访问者选择一个主题,然后记录该主题,并且每当该访问者返回时都将应用该主题。请注意,该主题是在页面的PreInit事件(它是一个新事件,它的激发时间甚至早于Init)中以编程方式应用于该页面的。

    在您运行该示例之前,需要启用匿名标识,并定义一个包含名为Theme的字符串属性的配置文件。以下代码行显示了执行上述两项任务的Web.config文件:

<configuration>
    <system.web>
        <anonymousIdentification enabled="true" />
        <profile>
            <properties>
                <property name="Theme" allowAnonymous="true" />
            </properties>
        </profile>
    </system.web>
</configuration>

SQL缓存依赖性

    ASP.NET 1.x中令人遗憾地缺少的另一项功能是数据库缓存依赖性。可以将ASP.NET应用程序缓存中放置的项目与其他缓存项目联系起来,或者与文件系统中的对象联系起来,但不能与数据库实体联系起来。ASP.NET 2.0通过引入SQL缓存依赖性来纠正这一由于疏忽而造成的错误。

    SQL缓存依赖性由新的SQLCacheDependency类的实例表示。它们的用法非常简单。下面的语句将一个名为ds的数据集插入到应用程序缓存中,并且在该数据集和Northwind数据库的Products表之间创建依赖性:

Cache.Insert ("ProductsDataSet", ds,
    new SqlCacheDependency ("Northwind", "Products");

    如果Products表的内容改变,则ASP.NET会自动删除该数据集。

    SQL缓存依赖性还可以与ASP.NET输出缓存配合使用。下面的指令指示ASP.NET缓存来自包含页面的输出,直至Products表的内容改变或者满60秒为止(满足任一条件即可):

<%@ OutputCache Duration="60" VaryByParam="None"
    SqlDependency="Northwind:Products"
%>

    SQL缓存依赖性适用于SQL Server 7.0、SQL Server 2000和即将问世的SQL Server 2005。对于SQL Server 2005,无需进行任何准备;但必须将SQL Server 7.0和SQL Server 2000数据库配置为支持SQL缓存依赖性。准备工作涉及到创建数据库触发器,以及创建一个特殊的表,以供ASP.NET在确定是否已经发生更改时参考。该表由一个后台线程使用可配置的轮询间隔(默认为5秒钟)来定期轮询。在SQL Server 2005中,要检测更改,既不需要特殊的表,也不需要轮询。此外,SQL Server 2005缓存依赖性可以在行级应用,而SQL Server 7.0和SQL Server 2000缓存依赖性在表级工作。您可以使用Aspnet_regsqlcache.exe工具或Webadmin.axd来准备数据库,以使其支持SQL缓存依赖性。

新的动态编译模型

    ASP.NET 1.x中引入的众多创新之一是:系统能够在首次访问您的代码时对其进行编译。但是,只有页面能够被自动编译,并且辅助类(如数据访问组件)必须单独编译。

    ASP.NET 2.0扩展了动态编译模型,以便能够自动编译几乎所有的组件。bin目录仍然保留以便实现向后兼容性,但它现在添加了名为Code和Resources的目录。Code目录中的C#和Visual Basic文件以及Resources目录中的RESX和RESOURCE文件被ASP.NET自动编译并缓存在系统子目录中。此外,落入Code目录中的Web服务描述语言(WSDL)文件被编译为Web服务代理,而XML架构定义语言(XSD)文件被编译为类型化数据集。通过Web.config,还可以扩展这些目录以支持其他文件类型。

预编译并且在不带源代码的情况下进行部署

    提到动态编译,与ASP.NET 1.x有关的最常见问题之一是:是否可以预编译页面,以避免在首次访问页面时发生的编译延迟?尽管该问题本身在某种程度上无关紧要(延迟非常小,并且延迟的开销被成千上万甚至数以百万的后续请求所分摊),但Microsoft仍然感到有必要采取相应的措施来减轻开发人员的担忧。这一“措施”就是能够通过提交对名为precompile.axd的幻像资源的请求,来预编译应用程序中的所有页面。

    但预编译并不仅限于此。另一个经常被请求的功能是:能够将整个应用程序预编译为可以在不带源代码的情况下进行部署的托管程序集(该功能在宿主方案中尤其有用)。ASP.NET 2.0包含一个名为Aspnet_compiler.exe的新的命令行工具,它能够执行预编译并且在不带源代码的情况下进行部署;Visual Studio 2005将包含类似的功能。下面的命令将预编译Web1目录中的应用程序,并且在不带源代码的情况下将其部署到Web2:

Aspnet_compiler -v /web1 -p c:\web1 c:\web2

    之后,目标目录将包含空的ASP.NET文件(ASPX、ASCX、ASIX等等)以及源目录中存在的所有静态内容(如HTML文件、.config文件和图像文件)的副本。在不带源代码的情况下进行部署并不会为您的知识产权提供牢不可破的保护,因为聪明的ISP仍然可以通过反编译生成的程序集来弄清楚应用程序的来龙去脉,但是,它确实对一般的代码窃取者设置了更大的阻碍。

新的代码分隔模型

    ASP.NET 1.x支持两种编程模型:内联模型—HTML和代码共存于同一个ASPX文件中;代码隐藏模型—它将HTML分隔到ASPX文件中,并将代码分隔到源代码文件(例如,C#文件)中。ASP.NET 2.0引入了第三个模型:一种新的代码隐藏形式,它依赖于Visual C#和Visual Basic .NET编译器中的不完全类支持。新的代码隐藏解决了原来的代码隐藏中存在的一个恼人的问题:传统的代码隐藏类必须包含受保护的字段,这些字段的类型和名称需要映射到ASPX文件中声明的相应控件。

    图10 显示了新的代码隐藏模型的工作方式。Hello.aspx包含页面的声明部分,Hello.aspx.cs包含代码。您应该注意@ Page指令中的CompileWith属性。此外,请注意MyPage类中缺少的字段(它们提供到ASPX文件中声明的控件的映射)。旧样式的代码隐藏仍然受支持,但新样式将是今后的首选编程模型。一点都不奇怪,Visual Studio 2005天生就支持新的代码分隔模型。

Hello.aspx

<%@ Page CompileWith="Hello.aspx.cs" ClassName="MyPage" %>

<html>
    <body>
        <form runat="server">
            <asp:TextBox ID="Input" RunAt="server" />
            <asp:Button Text="Test" OnClick="OnTest" RunAt="server" />
            <asp:Label ID="Output" RunAt="server" />
        </form>
    </body>
</html>

Hello.aspx.cs

using System;

partial class MyPage
{
    void OnTest (Object sender, EventArgs e)
    {
        Output.Text = "Hello, " + Input.Text;
    }
}

图10 Codebehind模型

客户端回调管理器

    ASP.NET 2.0中我最喜欢的功能之一就是由新的客户端回调管理器提供的“轻量级回发”功能。在过去,ASP.NET页面必须回发给服务器才能调用服务器端代码。回发是低效的,因为它们将包含由页面控件生成的所有回发数据。它们还强制页面刷新,从而导致不雅观的闪烁。

    ASP.NET 2.0引入了客户端回调管理器,它使页面无需完全回发就可以回调到服务器。回调是异步的,并且通过XML-HTTP来完成。它们不包含回发数据,并且不会强制页面刷新。(在服务器端,页面像平常一样执行至PreRender事件,但在即将呈现任何HTML之前停止。)它们确实需要支持XML-HTTP协议的浏览器(这通常意味着Microsoft Internet Explorer 5.0或更高版本)。

    使用客户端回调管理器涉及三个步骤。首先,调用Page.GetCallbackEventReference以获取对某个特定函数(可以从客户端脚本中调用该函数,以执行到服务器的XML-HTTP回调)的引用。ASP.NET提供了该函数的名称和实现。其次,在客户端脚本中编写一个将在回调返回时调用的方法。方法名称是传递给GetCallbackEventReference的参数之一。第三,在页面中实现ICallbackEventHandler接口。该接口包含一个方法—RaiseCallbackEvent,当回调发生时,该方法将在服务器端调用。RaiseCallbackEvent所返回的字符串将被返回到第二步所述的方法。

    图11 中的代码显示了客户端回调的工作方式,并且演示了它们的一个非常实际的用途。该页面显示了一个请求姓名和地址的窗体。在Zip Code字段中键入378xx或379xx邮政编码,然后单击Autofill按钮,City字段中将显示一个名称。值得注意的是,该页面会返回到服务器以获取城市名称,但它使用客户端回调而不是完全回发来完成此工作。在实际操作中,它可以找到某个数据库以将邮政编码转换为城市名称。请注意,该页面并不像页面在回发到服务器时通常所做的那样进行重新绘制。相反,更新是快速且简洁的!

<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>

<html>
    <body>
        <h1>Please Register</h1>
        <hr>
        <form runat="server">
            <table>
                <tr>
                    <td>First Name</td>
                    <td><asp:TextBox ID="FirstName" RunAt="server" /></td>
                    <td></td>
                </tr>
                <tr>
                    <td>Last Name</td>
                    <td><asp:TextBox ID="LastName" RunAt="server" /></td>
                    <td></td>
                </tr>
                <tr>
                    <td>Address 1</td>
                    <td><asp:TextBox ID="Address1" RunAt="server" /></td>
                    <td></td>
                </tr>
                <tr>
                    <td>Address 2</td>
                    <td><asp:TextBox ID="Address2" RunAt="server" /></td>
                    <td></td>
                </tr>
                <tr>
                    <td>City</td>
                    <td><asp:TextBox ID="City" RunAt="server" /></td>
                    <td></td>
                </tr>
                <tr>
                    <td>State</td>
 &n,bsp;                  <td><asp:TextBox ID="State" RunAt="server" /></td>
                    <td></td>
                </tr>
                <tr>
                    <td>Zip Code</td>
                    <td><asp:TextBox ID="Zip" RunAt="server" /></td>
                    <td><asp:Button ID="AutofillButton" Text="Autofill"
                        RunAt="server" /></td>
                </tr>
            </table>
        </form>
    </body>
</html>

<script language="javascript">
// Function called when callback returns
function __onCallbackCompleted (result, context)
{
    // Display the string returned by the server's RaiseCallbackEvent
    // method in the input field named "City"
    document.getElementById ('City').value = result;
}
</script>

<script language="C#" runat="server">
void Page_Load (Object sender, EventArgs e)
{
    // Get callback event reference (e.g., "__doCallback (...)")
    string cbref = GetCallbackEventReference (this,
        "document.getElementById ('Zip').value",
        "__onCallbackCompleted", "null", "null");

    // Wire the callback event reference to the Autofill button with
    // an onclick attribute (and add "return false" to event reference
    // to prevent a postback from occurring)
    AutofillButton.Attributes.Add ("onclick",
        cbref + "; return false;");
}

// Server-side callback event handler
string ICallbackEventHandler.RaiseCallbackEvent (string arg)
{
    if (arg.StartsWith ("378"))
        return "Oak Ridge";
    else if (arg.StartsWith ("379"))
        return "Knoxville";
    else
        return "Unknown";
}
</script>

转载于:https://www.cnblogs.com/yohen/articles/877407.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++ 交换两个数,不使用第三个变量, 函数模板来实现

#include <iostream>template<typename T> void exchangeTwoNumber(T &t1, T &t2)&#xff1b;void test();int main() {int a 10, b 20;double q 10.1, w 20.2;char z z, x x;std::cout << "交换前的 a " << a << &qu…

Oracle错误集!

个人使用Oracle时出现的错误&#xff0c;在这里记下来&#xff0c;加深印象。 1、ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes 今天写存储过程时&#xff0c;使用dbms_output.put_line(result:||i||---||documentID);输出测试结果。当我设置其输出记录较多…

[原+转]CSS hack 小技巧 让你的CSS 兼容ff ie6.0 ie7.0

在做东西的时候发现在ie6.0中做的东西到ff下面目全非100% css不兼容不问题 查阅了相关资料 个人感觉以下是一个笨的也是比较快的处理兼容问题的方法方法就是针对不同的浏览器写不同的css 以前用!important 但是ie7 和ff 就不好分了个人感觉比较好的方法是 samplepadding:0px; …

准备试用svn

用了VSS2005感觉一般&#xff0c;准备试用svn&#xff01;&#xff01;&#xff01;转载于:https://www.cnblogs.com/jessenee/archive/2008/03/31/1131027.html

web功底之强,实属罕见。。

不看不知道&#xff0c;一看汗得死你了。。纯用html做的。不多说&#xff0c;看看就知道了&#xff0c;http://www.kanqq.com/qq/smilies/ku.htm 以人格保证&#xff0c;不是病毒网页。。。 转载于:https://www.cnblogs.com/lsgoodsun/archive/2007/11/04/949222.html

第三次作业-Scrum

理解&#xff1a; 首先&#xff0c;敏捷并不是一门具体的技术&#xff0c;而是一种理念或者说是一种思想。它可以指导我们更加高效的开发。其次&#xff0c;敏捷开发都具有以下共同的特征&#xff1a; 1.迭代式开发2. 增量交付 3. 开发团队和用户反馈推动产品开发 4. …

如何处理错误消息Please install the gcc make perl packages

2019独角兽企业重金招聘Python工程师标准>>> 如何处理这行错误消息&#xff1f; Please install the gcc make perl packages from your distribution。 执行命令行&#xff1a;yum install gcc perl make 输出&#xff1a; Loaded plugins: product-id, search-dis…

iOS开发 CGAffineTransform 让图片旋转, 旋转后获得图片旋转的角度

1.让图片旋转 UIImageView *imageView [[UIImageView alloc]init]; imageView.frame CGRectMake(50, 50, 200, 200); imageView.image [UIImage imageNamed:"460.jpg"]; CGAffineTransform transform CGAffineTransformMakeRotation(M_PI*0.38); imageView.tr…

致毕业生:那些年我们错过的“BAT”

本文旨在用最通俗的语言讲述最枯燥的基本知识最近看到公众号中各种推“招聘季金九银十铜十二”之类的文章&#xff0c;把毕业季找工作需要应对的事情和解决方法都已经写的很详细了&#xff0c;还有各种面经考经挥之即来&#xff0c;已经没必要再去写这样的一个文章了&#xff0…

PHP函数收藏---不断更新中!

替换html标签 function strip_bad_tags($html) { $s preg_replace ("?[^>]*>*", "", $html); return $s; } 替换指定tag,$text是需要替换的文本,tags 是需要替换标签的数组 function strip_selected_tags($text, $tags array()) { $args func_ge…

gcc 5.2.0 手动更新(亲测)

注意:(不要在gcc-5.2.0 源码目录中执行 configure&#xff0c;否则会报错)安装操作如下&#xff1a;0、yum 安装 gcc yum -y install gcc gcc-c libstdc libstdc-devel autoconf makegcc-5.2.0 下载地址&#xff1a;ftp://gcc.gnu.org/pub/gcc/releases/gcc-5.2.0/gcc-5.2.0…

Lie to me不错

最近Fox的新剧有个Lie to me不错&#xff0c;如果你腻了了没完没了的Lost&#xff0c;觉得Hero开始离谱了&#xff0c;Prison Break只能重看第一季了&#xff0c;怀念Friends的经典又不忍心再看第10遍的话&#xff0c;这个剧是个不错的选择。 看了一集了&#xff0c;每个人平均…

NLog 简单使用

1.安装NLog 使其集成到VS 里 下载地址&#xff1a; http://nlog-project.org/ 2.NLog.config <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi"http://www.w3.or…

10.31T2 点双联通分量+预处理前缀+二分答案

2.逛公园I (parka) 【问题描述】 琥珀色黄昏像糖在很美的远方&#xff0c;思念跟影子在傍晚一起被拉长…… 小 B 带着 GF 去逛公园&#xff0c;公园一共有 n 个景点&#xff0c;标号为 1 . . . n。景点之间有 m 条路径相连。 小 B 想选择编号在一段区间 [l, r] 内的…

SQL学习笔记之存储过程的编写

今天写几个存储过程&#xff0c;觉得有这个必要记录下来&#xff0c;方便以后忘了也好有个备份&#xff0c;都很简单&#xff0c;高手可以不用看的。一、记录的插入--region [dbo].[InsertArchive]--------------------------------------------------------------------------…

应用安全-操作系统安全-漏洞修复整理

FTP弱密码 将FTP服务器的密码更改为强密码 vi /etc/vsftpd/vsftpd.conf anonymous_enableNO #禁止匿名登录 重启ftp服务 Windows匿名用户整改参考&#xff1a; https://www.jb51.net/article/135347.htm View CodeSSH弱密码 修改ssh配置文件&#xff1a; 1.修改iptables 首先要…

【2.0】SpringBoot连接MySql 8.0的url设置

jdbc:mysql://localhost:3306/enterprise?useUnicodetrue&amp&useSSLfalse&amp&characterEncodingUTF-8&amp&serverTimezoneGMT%2B8

Java自定义JSlider UI

Java自定义JSlider UI JSlider作为Swing中提供的滑标组件&#xff0c; 以图形方式在有界区间内通过移动滑块来选择值&#xff0c;滑块可以显示主刻度标记和次刻度标记。大量应用于如播放器中的音量设定等领域中。但是JSlider本身提供的UI样式很单调&#xff0c;不足以满足用户的…

Chrome OS 云里雾里

昨天Google发布了ChromeOS&#xff0c;之前有牛人编译了它的源码并创建了虚拟机分享出来。具体的BT种子不记得了&#xff0c;有需要的可以搜索一下chromeos-image-999.999.32309.211410-a1.vmdk.bz2。看看哪还有种子可用。文件大概287M左右&#xff0c;解压后大概7、8百M。当下…

C++基础学习一(基础之基础)

开篇&#xff1a;做了这么多年的软件&#xff0c;第一次使用博客的方式记录学习过程&#xff0c;之前都是笔记本&#xff08;都有一摞了&#xff09;&#xff0c;因为之前一直从事的都是.NET的开发工作&#xff0c;对C知之甚少&#xff0c;但一直想了解C这门鼻祖级的语言&#…