A few weeks ago Scott Guthrie (Fearless leader of IIS, ASP.NET and Visual Web Dev as he self describes in his profile at ww.asp.net J) announced a new type of project for web application development in Visual Studio 2005. This is called the Web Application project type and makes ASP.NET 2.0 behave the same way it did in the Visual Studio 2003 days. This is something we have been asking for quite some time because we believe that as an enterprise developer you need full control over the application you are building.
While test driving the latest technical preview (found here) of the web application project type I ran into a little problem using the profile API. In a Visual studio 2005 web site project you are used to the Visual Studio behavior that from your page you can get strongly typed access to the profile properties you defined in your web.config file. In a web application project you won’t find this behavior in the current bits. Because in web site projects the environment dynamically compiles the web.config defined properties into a profile class your page will be using, you get this behavior. This dynamic behavior is just what the web application project type is ruling out and gives you full control over what is compiled into one assembly. So it does not contain the dynamic generated profile class. My big question was how I could use the profile API when this behavior is missing. The answer is quite simple; you van just access the profile properties using the profile variable found in the current http context user object. See code snippet below:
ProfileCommon p = (ProfileCommon)HttpContext.Current.User.Profile;
p[“myProfileProperty“] = 5;
While this is a workable way of accessing the profile API, I would wait just a little bit before coding the profile like this. I suggested that one would like to have the same experience as with the web pages in the form of a .designer file (like in windows forms) that contains the design time entered profile information. The thing is that they already considered this as an option, but because of time constraints Scott could promise that this behavior (using a web.config.designer file )will make it to the release version of web application projects.
I certainly hope so, but I must say that I am already very happy with the fact we now get Web Application projects and full control back for building web applications. Whether this feature makes it or not to the final bits, we will use this type of project defacto for the web applications we build.
4 comments
Hi,
Thanks for the nice article. Actually I am getting the same issue in my application, as it is the web application project. The way you have suggested to get the profile is nice but when i have tried this at my end its not working. The first thing I am not getting the ProfileCommon, intelligence showing “can not ressolve symbol ProfileCommon”. The second issue is “HttpContext.Current.User.Profile”, here intellicence showing same message for profile. I am not getting anything other than Identity and IsInRole for HttpContext.Current.Use. Do I need to give any reference to get the profilecommon and HttpContext.Current.User.Profile.
Thanks in advance.
Rakesh
Rakesh,
This code worked in the early preview versions published then. They changed the implementation slightly, so now you need to use:
ProfileBase p = (ProfileBase)HttpContext.Current.Profile;
p[“myProfileProperty”] = 5;
Hope this helps,
cheers
Marcel
marcelv
I get object null reference error when assigning value to profile property.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
code:
ProfileBase p = (ProfileBase)HttpContext.Current.Profile;
p[“StartDate”] = 230;
literalTestDateView.Text = p[“CityCode”].ToString();
web.config
Bijay
I got the null errror fixed. Create the ProfileBase object and assigned on page_load.
Now the following error came. Any help on this will be appreciated.
I don’t need to save anything on DB and want o use Profile as Session variable..
An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
SQLExpress database file auto-creation error:
The connection string specifies a local Sql Server Express instance using a database location within the applications App_Data directory. The provider attempted to automatically create the application services database because the provider determined that the database does not exist. The following configuration requirements are necessary to successfully check for existence of the application services database and automatically create the application services database:
If the applications App_Data directory does not already exist, the web server account must have read and write access to the applications directory. This is necessary because the web server account will automatically create the App_Data directory if it does not already exist.
If the applications App_Data directory already exists, the web server account only requires read and write access to the applications App_Data directory. This is necessary because the web server account will attempt to verify that the Sql Server Express database already exists within the applications App_Data directory. Revoking read access on the App_Data directory from the web server account will prevent the provider from correctly determining if the Sql Server Express database already exists. This will cause an error when the provider attempts to create a duplicate of an already existing database. Write access is required because the web server accounts credentials are used when creating the new database.
Sql Server Express must be installed on the machine.
The process identity for the web server account must have a local user profile. See the readme document for details on how to create a local user profile for both machine and domain accounts.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[SqlException (0x80131904): An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)]
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +739123
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +188
System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject) +685966
System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) +109
System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) +383
System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) +181
System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) +170
System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) +130
System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) +27
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +47
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +105
System.Data.SqlClient.SqlConnection.Open() +111
System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) +68
[HttpException (0x80004005): Unable to connect to SQL Server database.]
System.Web.Management.SqlServices.GetSqlConnection(String server, String user, String password, Boolean trusted, String connectionString) +124
System.Web.Management.SqlServices.SetupApplicationServices(String server, String user, String password, Boolean trusted, String connectionString, String database, String dbFileName, SqlFeatures features, Boolean install) +86
System.Web.Management.SqlServices.Install(String database, String dbFileName, String connectionString) +25
System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(String fullFileName, String dataDir, String connectionString) +397
Bijay