[原创]web application中使用Profile应该注意的问题

转载请注明出处:菩提树下的杨过 http://blog.sqlsky.com
 
1.如何在web application中正确使用Profile
web application与website的一个不同之处在于,web application中无法象website中那样,直接用类似Label1.Text = Profile.XXX;这样的方式引用Profile(编译会直接报错)

解决办法有二种:
(1)
读取Profile值的代码改为:

1HttpContext.Current.Profile.GetProfileGroup("GroupName").GetPropertyValue("PropertyName");  //Profile有分组的情况 
2HttpContext.Current.Profile.GetPropertyValue("GroupName.PropertyName");  //Profile有分组情况的另一种写法 
3HttpContext.Current.Profile.GetPropertyValue("PropertyName"); //Profile无分组的情况 

修改Profile值的代码改为:

1HttpContext.Current.Profile.SetPropertyValue("GroupName.PropertyName", "Value"); //有分组情况
2HttpContext.Current.Profile.SetPropertyValue("PropertyName", "Value"); //无分组情况

保存

HttpContext.Current.Profile.Save();

缺点:这样虽然可以读取/修改/保存Profile,但这种写法把Profile降级为弱类型了,在vs.net开发环境中也失去了代码提示自动感知的能力

(2)推荐使用!利用Web Profile Builder生成强类型的Profile
步骤:
a.先到http://code.msdn.microsoft.com/WebProfileBuilder/Release/ProjectReleases.aspx?ReleaseId=674 这里下载这个免费的开源小插件,并安装
b.修改web.config文件,首先增加一个节点

<sectionGroup name="robo.webProfile">
<section name="webProfileSettings" type="WebProfileBuilder.WebProfileConfigurationSection, WebProfileBuilder, Version=1.1.0.0, Culture=neutral, PublicKeyToken=01d50f1f82943b0c" allowLocation="true" allowDefinition="Everywhere"/>
</sectionGroup> 

把这一段复制到<configSections>这一行的后面,即

<?xml version="1.0"?>
<configuration>
 <configSections>
  <sectionGroup name="robo.webProfile">
   <section name="webProfileSettings" type="WebProfileBuilder.WebProfileConfigurationSection, WebProfileBuilder, Version=1.1.0.0, Culture=neutral, PublicKeyToken=01d50f1f82943b0c" allowLocation="true" allowDefinition="Everywhere"/>
  </sectionGroup>
  

然后再把

<robo.webProfile>
 <webProfileSettings className="CntvsWebProfile" directory="App_Code" fileName="CntvsWebProfile"/>
</robo.webProfile> 

复制到</configSections>的下面,即


</configSections>
<robo.webProfile>
 <webProfileSettings className="CntvsWebProfile" directory="App_Code" fileName="CntvsWebProfile"/>
</robo.webProfile>

稍微解释一下,这一段告诉编译器,将在App_Code目录下生成一个CntvsWebProfile.cs的文件,类名为CntvsWebProfile(当然还可以指定namespace,具体可以参看WebProfileBuilder的sample),注意App_Code如果不存在将生成失败,另外最好在App_Code目录下,事先新建一个空的CntvsWebProfile.cs,否则好象也容易造成失败
c.关键!!!:修改项目文件xxx.csproj
退出vs.net,用记录本打开项目文件,找到 
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
在这里再加上一行

<Import Project="$(MSBuildExtensionsPath)\WebProfileBuilder\WebProfileBuilder.targets" />

这里就是告诉编译器,每次Build时,如果遇到web.config中的Profile设置有变化,将自动重新生成CntvsWebProfile.cs文件!!!
d.完成上述操作后,再次打开该项目,会提示该项目文件已经被修改,可能不安全之类的警告,不要理它,继续正常加载项目,Build一下,检查一下App_Code/CntvsWebProfile.cs的内容是否正确,如果正确的话,还要检查一下该cs文件的Property中的Build Action是否为Compile,如果不是,调整为Compile,否则别的地方没办法引用这个类

ok,终于完成了,下面再来看下如何使用这个cs类:
先给出web.config中的Profile配置节:

 1
 2<anonymousIdentification enabled="true"/>
 3<profile defaultProvider="CNTVSWebSiteProfileProvider" enabled="true">
 4 <providers>
 5  <add name="CNTVSWebSiteProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ConnStr"/>
 6 </providers>
 7 <properties>
 8  <group name="AdminSystem">
 9   <add allowAnonymous="true" name="Sex" type="String" defaultValue="Female"/>
10   <add allowAnonymous="true" name="Age" type="Long"/>
11   <add allowAnonymous="true" name="Name" type="String" defaultValue="unknown"/>
12  </group>
13 </properties>
14</profile> 
15

 强类型使用Profile的示例代码:

 1using System;
 2using System.Collections;
 3using System.Configuration;
 4using System.Data;
 5using System.Linq;
 6using System.Web;
 7using System.Web.Profile;
 8using System.Web.Security;
 9using System.Web.UI;
10using System.Web.UI.HtmlControls;
11using System.Web.UI.WebControls;
12using System.Web.UI.WebControls.WebParts;
13using System.Xml.Linq;
14
15
16namespace Website
17{
18    public partial class _Default : System.Web.UI.Page
19    {
20        public static CntvsWebProfile Profile
21        {
22            get { return new CntvsWebProfile(HttpContext.Current.Profile); }
23        }
24
25        protected void Page_Load(object sender, EventArgs e)
26        {
27            ReadProfile();
28            SetProfile();
29        }
30
31
32        void ReadProfile() 
33        {
34            if (!IsPostBack)
35            {
36                txtAge.Text = Profile.AdminSystem.Age.ToString();
37                txtSex.Text = Profile.AdminSystem.Sex;
38                txtName.Text = Profile.AdminSystem.Name;
39            }
40        }
41
42        void SetProfile()
43        {
44            Profile.AdminSystem.Name = User.Identity.Name;
45            Profile.Save();
46        }
47
48        protected void btnSet_Click(object sender, EventArgs e)
49        {
50            Profile.AdminSystem.Age = Convert.ToInt16(txtAge.Text);
51            Profile.AdminSystem.Sex = txtSex.Text;
52            Profile.AdminSystem.Name = txtName.Text;
53            Profile.Save();
54        }
55    }
56}
57
58

代码很简单,除了要声明一个static的CntvsWebProfile外,其它跟website的使用方式完全一样

2.如何将一个匿名用户的Profile迁移到认证用户?
这种情况特别是在购物系统中很常见,比如浏览者在未登录的情况下,可以先把喜欢的商品加入基于Profile的购物车,要结算的时候再登录去付帐,默认情况下,匿名用户一旦登录成为认证用户,匿名状态下购物车中的东东将“丢失”,这里如果能把匿名用户的Profile迁移到认证用户就能避免该问题,解决办法:在Global.asax全局文件中处理,在全局文件中增加一个事件:Profile_MigrateAnonymous,代码参考下面  

// 将Profile值从匿名用户迁移到认证用户
protected  void Profile_MigrateAnonymous(Object sender, ProfileMigrateEventArgs e)
{

    //得到匿名用户的Profile
    CntvsWebProfile anonProfile = new CntvsWebProfile(System.Web.Profile.ProfileBase.Create(e.AnonymousID));

    //得到当前通过验证的用户的Profile
    CntvsWebProfile Profile = new CntvsWebProfile(HttpContext.Current.Profile);

    //将匿名用户的Profile赋值给认证用户
    Profile.AdminSystem.Age = anonProfile.AdminSystem.Age;
    Profile.AdminSystem.Name = anonProfile.AdminSystem.Name;
    Profile.AdminSystem.Sex = anonProfile.AdminSystem.Sex;
    
    //删除匿名Profile
    ProfileManager.DeleteProfile(e.AnonymousID);
    AnonymousIdentificationModule.ClearAnonymousIdentifier();

    //保存Profile
    Profile.Save();            

 

菩提树下的杨过 2008-4-12晚 整理于 上海

时间: 2024-11-01 16:54:38

[原创]web application中使用Profile应该注意的问题的相关文章

在ASP.NET Web Application中通过SOAP协议调用Bing搜索服务

本文介绍了如何在ASP.NET Web Application中将Bing搜索作为Web Service来使用,并通过HTTP的SOAP协议在ASP.NET Web Application中调用Bing搜索功能.当然,我们也可以使用XML和JSON来调用Bing搜索服务,稍后会给出一些相关的例子. 本文中我将向大家演示下面这些内容: 创建一个Web Application与Bing搜索服务进行交互 添加Bing搜索服务的引用 使用Bing SourceTypes演示在线搜索功能 Bing搜索服务

Reporting Service在Web Application中的应用

由于我们这个项目中使用微软的报表服务(Reporting Services)作为报表输出工具,本人也对它进行一点点研究,虽没有入木三分,但这点知识至少可以在大部分Reporting Service的场景中应用.   原先刚装上Reporting Service时还觉得有点神秘,毕竟在做这个项目前还没有真正接触这个微软用于代替水晶报表的报表工具,而且微软似乎还不满足于一个报表工具那么简单.   Reporting Services 是一种基于服务器的新型报表平台,部署在Microsoft SQL

asp.net Reporting Service在Web Application中的应用_实用技巧

原先刚装上Reporting Service时还觉得有点神秘,毕竟在做这个项目前还没有真正接触这个微软用于代替水晶报表的报表工具,而且微软似乎还不满足于一个报表工具那么简单. Reporting Services 是一种基于服务器的新型报表平台,部署在Microsoft SQL Server 2000基础上,可用于创建和管理包含来自关系数据源和多维数据源的数据的表格报表.矩阵报表.图形报表和自由格式报表.可以通过基于 Web 的连接来查看和管理您创建的报表. Reporting Services

.NET之ASP Web Application快速入门(3)(转载)

application|web|快速入门 文件Global.asax 除了编写UI(Use Interface:用户界面)以外,我们还可以在Web Application中添加"application"级别的控制逻辑代码以及事件触发程序.这些代码不会去操作产生UI,并且基本上不会响应于单独的页面请求,它们负责的是处理高级别的application事件,包括Application_Start.Application_End.Session_Start和Session_End.这些控制逻辑

.net 如何在web.config中读取自定义节点以及注意的问题

web|问题 这几天在做一个urlMapping类库的时候用到了如何读取web.config中自定义节点, 做完后觉得挺好 现就制作过程叙述一下. web.config文件在web application中起着非常重要的作用. 它本身包含了授权,handler,compilation,globalization,错误与跟踪等一系列设置.但是当你需要一些特殊的或者想添加自己的settings时,应该如何做呢? 要创建自定义设置 要求有2步:写cs代码 和 修改web.config 代码 这里我们创

javaweb-Java Web开发中 application使用的问题

问题描述 Java Web开发中 application使用的问题 老师要我们用Myeclipse做一个网页聊天的东西,大概就是在网页中有两个文本框,一个大的文本框显示聊天的记录,下面一个小的文本框用来输入文字,旁边有一个button,点一下就可以发送了.求教,还有代码...谢谢!

Yii中使用Gii生成代码时碰到“Setting unknown property: yii\web\Application::gii”

 Yii中使用Gii生成代码时碰到"Setting unknown property: yii\web\Application::gii" 针对Gii的使用:http://www.yiichina.com/doc/guide/2.0/start-gii 和 https://github.com/yiisoft/yii2/blob/master/docs/guide/start-gii.md ,我把下面这段直接放在$config = [...];里面,然后就碰到了"Sett

从Apache Tomcat迁移到WebSphere Application Server Liberty Profile

简介 Apache Tomcat 是一个 HTTP 服务器和 servlet 容器,常用于简单的 Web 应用程序,以及使用不需要完整的 Java EE 服务器的框架的应用程序.然而,用户经常会发现,当对 Apache Tomcat 有更多需求时,其最初的简单性就会变得复杂且不实用. 例如,也许 Apache Tomcat 安装的占用空间会变得太大,因为您需要添加第三方库来提供所需的功能.或者,服务器的启动时间也可能是一个问题,因为对 server.xml 文件的任何配置更改都需要重新启动 Ap

ios-图片没有上传到web服务器中

问题描述 图片没有上传到web服务器中 上传一个图片到web服务器上,但是上传后之后图片的名字被保存了,图片没保存 代码: - (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [self dismissModalViewControllerAnimated:YES]; NSData *image = UIImage