3

I am using this example I found to learn how to load class files and access variables through them. This is in a file called Class1.vb in the App_Code folder (this is not an app project):

Imports Microsoft.VisualBasic
Public Class my_class
    Public Shared Sub my_sub()
        Dim vartest As String
        vartest = 10
        HttpContext.Current.Session("myvar") = vartest
    End Sub
End Class

This is the codebehind on the aspx file:

    Imports my_class
Partial Public Class test
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        my_class.my_sub()
        Label1.Text = HttpContext.Current.Session("myvar")
    End Sub
End Class

How could I access the vartest variable without using a session, since if this is accessed by multiple functions at the same time the variable can be overwritten I assume. Is it possible to go the other way, where a variable is sent to a class file?

0

4 Answers 4

12

It sounds like you need a quick overview of some basic ASP.Net Webforms concepts. Up first I'll counter a common newbie misconception:

Your Page class does not hang around on the web server for very long

I think many new ASP.Net developers have this idea of the web server keeping a single instance of their page class for every user session that hits their site, and each postback or event uses this same page class instance. That's just not how it works. ASP.Net page class instances are nearly always created and destroyed again in well under a second, and most experienced developers see it as a big problem if it takes longer.

ASP.NET relies on the HTTP protocol

The thing to remember here is ASP.Net still relies on the HTTP protocol, and http boils down to requests and responses. When you view a web page, your browser first sends a request to a server. The server responds, usually with an html document. The browser will then parse the html; based on what it sees in the html the browser may send more requests to the server for additional resources, such as javascript, images, or css files. Each request results in a separate response, and the browser uses all these resources to render the page to the screen. However, the ASP.Net runtime normally does not have to process the additional requests (that would make things slower) — ony the initial html needs ASP.Net support; you want the other resources to be basic files that can be cached.

The ASP.Net runtime creates a new instance of your class for every request.

When the ASP.net runtime processes a request for a page, it will create a new instance of your page class. The runtime will follow the ASP.Net Page lifecycle (this should really be named the "ASP.Net Page Request Lifecycle"), and call certain methods or raise certain events in this class instance, in a specific order defined by the lifecycle.

This means every postback or event runs in a different instance of your class.

It also means every postback or event is rebuilding and transmitting all of the html the goes into your page, and not just the portions you want to change. For your server code, the consequence is the only thing class-level variables are really good for in ASP.Net is things that will be used within a single http request. For the browser, the consequence is you're working with a brand new DOM after every event.

To understand all of that, it's important here to also have a good understanding of the difference between a class and an instance of a class. A couple items in your question make me unsure whether you have this understanding yet.

The ASP.Net runtime shares one application instance among all users of your site

The web server typically only has one instance of your application for the entire web site and all it's users. Therefore, anything with a Shared/static scope is common to every user. It's rarely appropriate in ASP.Net for anything to be Shared/static.

So how do you handle data that should live with a single user or visit to your site?

This is exactly what the Session is for. A session will always be unique to an individual request at any given time. You're worried about multiple functions accessing the session at the same time, but this does not happen. The ASP.Net Page Lifecycle ensures that unless you manually spawn additional threads, only one function at a time is running for a given HttpContext and Session. If a user somehow sends two requests at about the same time that should have the same Session/HttpContext, one will be held by the ASP.Net runtime until the other is completed. If you don't want to reference the session all the time, you can build properties in your class that wrap session variables. See @Pankaj's answer for an example.

Sign up to request clarification or add additional context in comments.

8 Comments

May I know, what is meant by the line when you said "The browser will then parse the html" ?
Don't you think both are contradictory when you said "and based on what it sees may send more requests to the server for additional resources, such as javascript, images, or css files. However, the asp.net runtime normally does not have to process these other requests (that would make things slower)."
@Pankaj - the asp.net runtime is a module or "handler" as part of the IIS web server. The IIS web server will process the additional requests, but the asp.net runtime handler will typically not be invoked (though sometimes people will configure it to process javascript or css)
@Pankaj - what do you think "The browser will then parse the html" means?
Understood your first comment about handler / Web Server... But doubt is , In the Website we normally have images/css, which normally downloads to the client every time. Any link that you will link to share that illustrates about the sentence "and based on what it sees may send more requests to the server for additional resources, such as javascript, images, or css files" I want to know the mechanism /detail behind - going back to the server again to get images/css on demand if any...
|
2

First, a Session has user-scope, so it will not be overwritten by another Request.

Is it safe to access asp.net session variables through static properties of a static object?

You could encapsulate the access into a property:

Public Shared Property MyVar() As String
    Get
        If HttpContext.Current.Session("MyVar") Is Nothing Then
            HttpContext.Current.Session("MyVar") = ""
        End If
        Return DirectCast(HttpContext.Current.Session("MyVar"), String)
    End Get
    Set(value As String)
        HttpContext.Current.Session("MyVar") = value
    End Set
End Property

Then you can get the variable by:

Label1.Text = my_class.MyVar

3 Comments

I meant if the same function in the class is run by the same person many times throughout a page
@sfreelander: So how should it be called simultaneously? If you would start multiple threads that read/write this property, this wouldn't be thread safe anymore. But that is true for every (non-local)object. Then you need some kind of locking mechanism. geekswithblogs.net/chrishan/archive/2005/11/04/59102.aspx
@sfreelander - that can't happen. A new instance of your class is created for every http request. ASP.Net page class instances are nearly always created and destroyed again in well under one second, and most page developers would see it as a big problem when they take longer.
2

In addition to the "Tim Schmelter" reply....

You can create a BaseClass which will inherit from

System.Web.UI.Page

Place the property as suggested by "Tim". The only change you need to do is to change the access modifier to Protected and you should remove Public and Shared

You can also keep other common functions, properties that can we reused in other classes also... Similarly you can create BaseControls as well for your User controls

Finally, inherit this class in the web form....

Hope this will help you...

Base Class code

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web

Public Class BaseClass
    Inherits System.Web.UI.Page
    Protected Property MyVar() As String
        Get
            If HttpContext.Current.Session("MyVar") Is Nothing Then
                HttpContext.Current.Session("MyVar") = ""
            End If
            Return Convert.ToString(HttpContext.Current.Session("MyVar"))
        End Get
        Set
            HttpContext.Current.Session("MyVar") = value
        End Set
    End Property
End Class

Sample Code "Behind Code" - Showing the usage of Protected member Data from Base Class

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Public Partial Class Default5
    Inherits BaseClass
    Protected Sub Page_Load(sender As Object, e As EventArgs)
        If Not Page.IsPostBack Then
            Dim str As String = Me.MyVar
        End If
    End Sub
End Class

Comments

0

Generally you can use different places to store application state: Application (application wide, saves state into application domain), Session (there can be saved everything what will be accessed by current browser session), ViewState (variables stored in hidden input field and will be posted on every postback). Of course you can also save state to database or file. I'm not sure what you want to achieve, but looks like you looking for something like ViewState.

Read ASP.NET State Management

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.