Problem with static field in asp.net web-site - c#

I'm currently working on an ASP.NET web-site. In one of my pages, I had a static field for the current logged in user's CompanyId.
private static Guid _CompanyId = Company.Get().CompanyId;
Company.Get() returns the information about the company of the currently logged in user, where the UserId is retrieved using:
System.Web.Security.Membership.GetUser();
But when logging in as another user, in antoher company, Company.Get().CompanyId would return the Guid from the first company.
Have I missed the point of using static fields, or does this have another cause?
I fixed it, by replacing all the references to _CompanyId in my code-behind with the Company.Get().CompanyId for a quick fix, but this is not really a good solution.

static variable value persist at the application level and hence across user wise. you should use session to store your information. static variable value is not change until you reassign the value, application restart, etc..

You should use HttpContext.Current to store session level variables. static variables are visible to all sessions in your web application.

Removing static from your field definition should give you what you're looking for.

Related

Session vs static Property in c#

I wanted to use some data from one page to another. General solution is to use Session (most of recommends). My boss don't like sessions and he suggested me to do same work by using C# Property in common class as below
public static long parentId { get; set; }
and set it one one page as
Common.parentId = "any value";
and use it on other page like
string anyVariable = Common.parentId
and it worked. We get rid of session expiration as well. But why most of people recommend session. Is property another state management thing?
If you are going to store some data using simple static property you must understand that it will be shared among all your users. Sessions are not for this. But I don't see any reasons not to use sessions if you want to store user data somewhere.
In my project it is very convenient, especially when we use SQL-server to store sessions - we can update our website without any losing users' sessions data.
You can check all possible ways to hanle sessions for example here http://msdn.microsoft.com/en-us/library/75x4ha6s(v=vs.100).aspx

Alternate for Session variable in c #, Can we use class and its object to store a value instead of session variable?

I am building a web application. The authentication will be managed by the website, that is not my concern. What i need to store is the UserID in some place.
Once they open the application I will be able to get their UserID. I was previously using a Session variable to store this. Can I create a class say:
static string _UserID;
public static string UserDetails
{
get
{
return _UserID;
}
set
{
_globalValue = \\value from webpage;
}
}
and use UserDetails._UserID instead of assigning it to a session variable?!
The website's session server is not very reliable so I thought I could use this way.
Will this work?
I learnt from the answers that the variables will be overwritten for each user which is not what I want!!
Will it be the same scenario if i create an instance of this class in handler and assign the UserID to it??
are there any other way where I can make its scope limited only to one user i.e UserID with which I login should be same and if new user login to the application it must not be overwritten?? what is the disadvantage of using this method??
Is this method good if I use only one page and assign the object in the launch of the applciation ??
Static variables persist for the life of the app domain. So the two things that will cause your static variables to 'reset' is an app domain restart or the use of a new class.
The main problem is that static variables are shared across ALL USERS, and that is dangerous in your case that you pretend to store an UserID inside it. If you want to store
per user sessoin ID you should use Session
You can find more info here:
Lifetime of ASP.NET Static Variable
static filed will be shared between all users that means you would overwrite it for everyone. If you do not want to store it in Session you may store it in cookie (encrypted if security is important).

ASP.NET Sessions in C#

My goal here is to properly assign a session and retrieve the value stored in that session.
When users come to my first page, a Default.aspx page, I set the session in the code behind.
HttpContext.Current.Session["permissions"] = "Super";
However, I am unable to access this section in a Data Access Class in another file. Am I doing something wrong, or does anyone know a correct way of accessing an already set session from a C# class?
I try to access the session using the same syntax:
String permission = HttpContext.Current.Session["permissions"].ToString();
I am pretty sure , that you can always override this situation. What you are trying to do is not considered a good design principal.
what you can do is to pass the CurrentUser and/or his/her role to the data class by populating a custom property on that class. Within that class you can use the value of this property to work on the user's role.
let me know , if this helps you.
For code samples , you can always look at this SO question
How to access session variables from any class in ASP.NET?

ASP.NET: variable that can be accessed by entire site

I am new to ASP .NET, I am trying to setup a website in Visual Studio with C#.
My background is in PHP. In that language, if I want a variable to be accessible by every page, simply put it in a include file.
Is there anything similar to C# and ASP .NET? There is an site.master page, but I am not sure how to access it's variables from page contents. Thanks in advance.
You have a few different options here:
Session Variables
Session variables are stored in the server's memory for each user, and can be read and written to as often as required. These are limited to a per-user basis, so if you want to hold a single variable for all users, then this isn't the way to go.
Usage:
Session["MyVariable"] = 5;
int myVariable = (int)Session["MyVariable"]; //Don't forget to check for null references!
You can to set a user's session variable in your global.asax file under the session_start event handler if required.
Application/Cache Variables
Application and Cache variables are accessible by any user, and can be get/set as required. The only difference between the two is that Cache variables can expire, which makes them useful for things such as database query results, which can be held for a while before they're out of date.
Usage:
Application["MyVariable"] = 5;
int myVariable = (int)Application["MyVariable"]; //Don't forget to check for null references!
You can set an application variable in your global.asax file in the application_start event handler if required.
Web.Config
This is probably the preferred way of storing constants in your application, since they are stored as "Application Settings" and changed in your web.config file as required without having to recompile your site. application settings are stored in the <appsettings> area of your file using this syntax:
<appSettings>
<add key="MyVariable" value="5" />
</appSettings>
Web.config values should be considered read-only in your code, and can simply be accessed using this code in your pages:
int myVariable = (int)System.Configuration.ConfigurationSettings.AppSettings["MyVariable"];
Static Variables
Alternatively, you could just create a class that contains a static property to hold your variable like this:
public class SiteVariables
{
private static _myVariable = 0;
public static int MyVariable
{
get { return _myVariable; }
set { _myVariable = value; }
}
}
And then access it like this:
int myVar = SiteVariables.MyVariable;
I actually use a combination of the latter two solutions in my code. I'll keep my settings in my web.config file, and then create a class called ApplicationSettings that reads the values from web.config when required using static properties.
Hope this helps
You could create a static class with a static member:
public static MyClass
{
public static MyVariable { get; set; }
}
Then from anywhere in the site you can call MyClass.MyVariable to get or set the value.
Keep in mind a significant difference between this and PHP. In PHP, you're running scripts and you include other scripts to make one big script. In ASP.NET, you're compiling code into assemblies. The patterns are different.
Indeed, just to have something like global php variable static classes could help you. But is it A Really what you whant? Because global variables are known to be harder mantainable, testable, etc...
Probably you want to "put" data somewhere and "take" it some where else.
There are A LOT out of the box ways to do it in .NET.
You can use SessionState to store something while session with a user lasts
http://msdn.microsoft.com/en-us/library/ms178581.aspx
You can use ViewState as a short term...
http://msdn.microsoft.com/en-us/library/ms972976.aspx
You can use settings to setup variables in web.config
http://msdn.microsoft.com/en-us/library/b5ysx397.aspx
You can use Profiles to store something related to user
http://msdn.microsoft.com/en-us/library/2y3fs9xs.aspx
You can use Application to store something more globally
http://msdn.microsoft.com/en-us/library/ms178594.aspx
And there are more...
Treat this post as "links" addition to Karl Nicoll's post.
You can access a property ( or field or method) on the master page by the Master property on your content page, which gives you a reference to the master page. You will need to cast it to a type that supports the property first, though:
((Site)Master).MyVariable
And MyVariable has to be visible to the content page, public or internal I think. And ideally you'd cast to a base type for the Master page, not directly as in the example above.
If it is a config option, use web.config file app settings section
If it is a session variable there is a session object
And you can also create an static class with some public members.

Session Variable problems when storing an object in my Session

I have a log in page where I valid my users and based on this validation I store their user info in a session variable so I can access it at any time. To do this I am trying to store an instance of one of my dbml generated classes "UserInfo". So I populate the class and then store it in a session variable I call "user"
UserInfo u = new UserInfo();
u = dal.RetrieveUser(userID, userPass)
Session["user"] = u;
The issue I am having with this is it seems to mix up these session variables between users. Or more specifically it always seems to take the information from the first user variable stored for each subsequent user that logs in. So user 1's info is being pulled in for User 2, User 3, etc...
Is my problem that my class "UserInfo" is somehow static? Or what is causing this to happen? My UserInfo class looks like this:
public partial class UserInfo
{
...
EDIT:
After further review it seems that my Session variables are in fact working properly but my custom menus are actually the problem.
Sounds more like an issue with the DAL than the session object. Can you verify that the userID passed each time is different and the RetrieveUser function is using the passed value and not a static one?
Are you testing this using the web client on the same computer or separate computers? For instance, by default FireFox will run in a single process even if you have multiple windows or tabs open. As silly as it sounds, a colleague of mine had not noticed this phenomena when he had the same issue.

Categories