Professional ASP.NET 1.1 [Electronic resources]

Alex Homeret

نسخه متنی -صفحه : 244/ 172
نمايش فراداده

ASP.NET

There are many changes to take into account when looking purely at ASP pages. The most obvious are the server controls and the postback architecture. These have been covered extensively in earlier chapters of the book, so now we'll move on to other features that still exist in ASP.NET, but are different from ASP. We'll also abbreviate explanations of changes that are explained in detail elsewhere in this book, and instead provide a summary and reference to them. Since ASP.NET is fully class-based, we'll also provide references to the underlying classes, so you can easily find full information in the documentation, or look up the classes in tools such as WinCV and ILDasm.

Preparing the Way

Before we delve into the changes in detail, here's a quick list of things you can do now, in your current ASP pages, to pave the way for migrating to ASP.NET:

Use only a single language within each ASP page

Use

Option Explicit to enforce declaration of variables

Use

<script> blocks for function declaration instead of

<% %> blocks

Avoid render functions

Use the

Call keyword for calling functions, to force the use of parentheses around arguments

Avoid default properties, such as

Recordset("column") instead of

Recordset.Fields("column").Value

Explicitly close open resources (such as the file system or recordsets)

Note

These are only relevant to server-side code – client-side code is still browser related.

Many of these are best practices anyway, but we all tend to take shortcuts. Adhering to this list will ease your migration path. You'll be looking at these in detail as you go through the chapter.

Intrinsic Objects

Most ASP intrinsic objects remain available and unchanged, providing excellent support for existing applications. However, there are changes to some properties and methods, as well as the addition of new ones. One significant change is the removal of the

ASPError object, as error handling is now managed by exceptions.

The Application Object

ASP.NET application state handling is implemented by the

HttpApplicationState class in the

System.Web namespace. Although ASP.NET supports ASP functionality by way of the

Contents and

StaticObjects collections, there are some minor differences that may confuse you if you check the documentation. The reason is

HttpApplicationState is a first class object that implements a collection (used to hold the items in application state). Therefore methods such as

Remove and

RemoveAll are members of the

HttpApplicationState object itself. However, to preserve compatibility, there is also a

Contents property, which simply points back to the parent object. Thus, the following lines of code are equivalent.

In VB.NET, the code is:

Application.Remove("Item1")

Application.Contents.Remove("Item1")

The code in C# is:

Application.Remove("Item1");

Application.Contents.Remove("Item1");

The first line in these code examples is what you'd see in .NET code samples, whereas the second line is how you'd do it in ASP. However, because compatibility has been preserved, they both work.

New features of the application object are shown in the following table. Note that although there are explicit

Add and

Get methods, the existing way of accessing the collection still works fine:

Property/Method

Description

AllKeys

Returns an array of strings containing the names of stored application state members.

Count

Returns a count of items in application state.

Add

Adds a new item to the state.

Clear

Removes all items from the state. This is equivalent to

RemoveAll , and is provided as part of the standard collection handling features.

Get

Returns an individual item (either by name or by ordinal).

GetKey

Returns the key for the supplied ordinal.

Set

Updates the value of a stored item.

Objects in Application State

In ASP it was always taboo to store single-threaded objects in

application state, which was a real problem for Visual Basic programmers developing components. Given that the .NET languages (including Visual Basic) allow the production of free-threaded components, has this problem now gone away? Well, to a degree yes, as long as you understand the following:

You can store free-threaded components as long as they provide thread synchronization.

You can store single-threaded components if you use

Lock and

Unlock to protect against thread blocks.

Application state has no guaranteed durability. The application domain can be torn down at any time (synchronized restart for example), so for durability you need an external store.

By and large, the storage of objects in

Application state is discouraged because of the resources used, and the potential for scalability and performance problems. However, the storage of scalar type data (such as

string ) is a great way to get some performance improvement, as long as it is used carefully. You might think that the classic case of wanting to store

Recordsets in

application state is now easy, since you can store the XML from a

DataSet , but remember that memory (although cheap) is finite. Frequent use of a 10Mb set of data stored in application state may give great benefits, but 100Mb may not. This sort of scenario needs full testing before the implications are really known.

The Session Object

Session state is implemented by the

HttpSessionState class in the

System.Web.SessionState namespace. The

Contents and

StaticObjects follow the same rules as

Application state – the structure of the class is different from ASP, but access works in the same way. Thus, the following examples are equivalent. In VB.NET:

Session.Remove("Item1")

Session.Contents.Remove("Item"1)

In C#:

Session.Remove("Item1");

Session.Contents.Remove("Item1");

The changed and new features of the session object are shown in the following table:

Property/Method

Description

Count

Returns a count of items in session state.

IsCookieless

Indicates whether or not session state is being handled in a cookieless manner.

IsNewSession

Indicates whether or not the session has been created with the current request.

IsReadOnly

Indicates whether or not the session is read -only.

IsSynchronized

Indicates whether or not access to the session state values is thread safe.

Mode

Indicates how session state is being stored. Will contain one of the

SessionStateMode constants:

InProc , for in process

Off , for no session state

StateServer , for the out -of -process state service

SQLServer , for SQL Server

SessionID

In ASP.NET the

SessionID property returns a

String (as opposed to a

Long in ASP)

SyncRoot

An object that provides synchronous access to the session contents.

Add

Adds a new item to the session state.

Clear

Removes all items from the session state. This is equivalent to

RemoveAll , and is provided as part of the standard collection handling features.

CopyTo

Copies the contents of the session state to an array of strings.

Equals

Compares an object in session state with the supplied one to see if they are the same.

Remove

In ASP, the

Remove method could take either the key name of the item or its index. In ASP.NET, you can only supply the name. To remove by index use the

RemoveAt method.

RemoveAt

Removes an item at the selected ordinal.

The Request Object

The request is implemented by the

HttpRequest class in the

System.Web namespace. All of the existing properties and methods are supported, although there are some notable exceptions regarding the use of collections (see in the following table) where the appropriate ASP 3.0

ServerVariables equivalent has been mentioned. New and changed properties or methods are detailed in corresponding fonts as follows:

Property

Description

AcceptTypes

Returns a string array of the MIME types supported by the client. For ASP this could be extracted from the comma separated

ServerVariables HTTP_ACCEPT entry.

ApplicationPath

The virtual application path.

Browser

Returns an

HttpBrowserCapabilities object describing the features of the browser.

ClientCertificate

Returns an

HttpClientCertificate object (as opposed to an array of values in ASP).

ContentEncoding

The character set of the entity body.

ContentLength

The length (in bytes) of the request. Equivalent to

CONTENT_LENGTH .

ContentType

The MIME type of the request. Equivalent to

CONTENT_TYPE .

Cookies

Returns an

HttpCookieCollection object (as opposed to an array of values in ASP).

FilePath

The virtual path of the request. Equivalent to

SCRIPT_NAME .

Files

Returns an

HttpFileCollection of uploaded files (for multi - part form posts).

Filter

Identifies the stream filter to use for the request. All content will be passed through the filter before being accessible by the page.

Form

Returns a collection (

NameValueCollection ) of

Form contents. Accessing this collection is different from accessing the

Form collection under ASP (see the

Request Collections sections).

Headers

A collection (

NameValueCollection ) of HTTP headers. In ASP these values are space -separated

name

:

value pairs; in .NET they can be accessed via

HTTP_

name .

HttpMethod

The HTTP method used for the request. Equivalent to

REQUEST_METHOD .

InputStream

A

Stream containing the input for the request.

IsAuthenticated

Indicates whether or not the user has been authenticated.

IsSecureConnection

Indicates whether or not the connection is using HTTPS. Equivalent to

HTTPS in ASP.

Params

A combined collection of

QueryString ,

Form ,

ServerVariables , and

Cookies .

Path

The virtual path of the request. Equivalent to

PATH_INFO .

PathInfo

Additional path information.

Physical ApplicationPath

The physical path of the application root. Equivalent to

APPL_PHYSICAL_PATH .

PhysicalPath

The physical path of the request. Equivalent to

PATH_TRANSLATED .

QueryString

Returns a collection (

NameValueCollection ) of

QueryString contents. Accessing this collection is different from accessing the

QueryString collection under ASP (see the

Request Collections section later in the chapter).

RawUrl

The raw URL of the request. Equivalent to

RAW_URL .

RequestType

The HTTP method used for the request. Equivalent to

REQUEST_METHOD .

TotalBytes

The number of bytes in the input stream.

Url

A

Uri object containing details of the request. A

Uri object (from the

System namespace) encapsulates information about a specific resource, such as port and DNS information.

UrlReferrer

A

Uri object detailing referrer information.

UserAgent

The browser user agent string. Equivalent to

HTTP_USER_AGENT .

UserHostAddress

The IP address of the user. Equivalent to

REMOTE_ADDR .

UserHostName

The DNS name of the user. Equivalent to

REMOTE_NAME .

UserLangauges

An array of langauges preferences. Equivalent to

HTTP_ACCEPT_LANGUAGE .

BinaryRead

Returns a

Byte array containing the binary information sent to the server. In ASP the return type is

variant .

MapImage Coordinates

Maps the image -field parameter to

x and

y coordinates.

MapPath

Maps the virtual path to a physical path. The method is now overloaded taking two forms. The first is the same as ASP where the parameter is the URL of the virtual path. The second takes three parameters: the virtual path, the virtual base directory for relative resolution, and a

Boolean indicating whether or not the virtual path may belong to another application.

SaveAs

Saves the HTTP request to disk.

Some of this information is still available through the

ServerVariables collection, but has now been abstracted out into more accessible properties.

The

Request object supports collections for accessing the contents of a form or query string, and there are some major implications where those contents contain elements of the same name. This is typically the case where check boxes, radio buttons, or multi-select list boxes are used. For example, consider the following ASP form:

<form action="foo.asp" method="post">

Select your favorite editor:

<select name="editor" multiple="multiple">

<option>Notepad

<option>Textpad

<option>Visual Studio .NET

</select>

<p/>

<input type="submit" value="Send">

</form>

To extract the selected values from the multi-select list you could use:

For item = 1 To Request.Form("editor").Count

Response.Write Request.Form("editor")(item) & "<br/>"

Next

However, this code will not work in ASP.NET, as a

NameValueCollection represents the form contents. There are two points about this:

The collection is zero based

You have to explicitly get the values

For example:

Dim item As Integer

For item = 0 To Request.Form.GetValues("editor").Length - 1

Response.Write (Request.Form.GetValues("editor")(item) & "<br/>")

Next

Here you have to use the

GetValues() method of the collection, and index into that (using a base of 0) to get the required value.

The Response Object

The response to a request is implemented by the

HttpResponse class. Like the request, all existing functionality is kept, with the following changes or additions:

Property/Method

Description

BufferOutput

Indicates whether or not to buffer output. This is the same as the

Buffer property, and is the preferred method of changing buffering in ASP.NET.

Cache

Returns an

HttpCachePolicy object, containing details about the caching policy of the current response.

CacheControl

Although still supported, this property is deprecated in favor of the

HttpCachePolicy methods.

ContentEncoding

Identifies the character set of the output. The value can be one of those listed in the

Encoding enumeration (

ASCIIEncoding ,

UnicodeEncoding ,

UTF7Encoding ,

UTF8Encoding ).

Cookies

Returns a collection (

HttpCookieCollection) of

HttpCookie objects (as opposed to an array of attributed values in ASP). The ASP cookie attributes appear as properties of the

HttpCookie object.

Expires

Although still supported, this property is deprecated in favor of the

HttpCachePolicy methods.

ExpiresAbsolute

Although still supported, this property is deprecated in favor of the

HttpCachePolicy methods.

Filter

The

Stream object that acts as the output filter. All output will go through this filter before being returned to the client.

Output

Returns a

TextWriter object through which custom output can be returned to the client.

OutputStream

Returns a

Stream object representing the raw data of the content body.

Status

Sets the HTTP status code to return to the client. This property has been deprecated in favor of the

StatusDescription property.

StatusCode

The HTTP status code of the response.

SuppressContent

Indicates whether or not content is to be returned to the client.

AddFileDependencies

Adds a group of file names to the dependency list upon which the response is based. Changes to these files will invalidate the output cache.

AddFileDependency

Adds a single file name to the dependency list upon which the response is based. Changes to this file will invalidate the output cache.

AddHeader

This method has been deprecated in favor of the

AppendHeader method.

AppendHeader

Appends an HTTP header to the content stream. This method is preferred over

AddHeader .

ApplyAppPathModifier

Applies the

Cookieless Session ID to a given relative or virtual path. This allows

HREFS with fully qualified names to be modified to include the current

Session ID .

BinaryWrite

Writes binary data (a

Byte array) to the output stream. In ASP this is a variant array.

ClearContent

Clears the content from the buffer stream.

ClearHeaders

Clears the headers from the buffer stream.

Close

Closes the socket connection to the client.

Redirect

This method is now overloaded. The first form is the same as ASP, taking a URL, and the second form takes a URL and a

Boolean indicating whether or not

Response.End is called after the redirection.

Write

This method is overloaded, and can take one of four sets of parameters:

A

Char

An

Object

A

String

A

Char array, along with the start index and number of characters to write

WriteFile

Writes the specified file directly to the output stream.

The Server Object

The

Server object is implemented by the

HttpServerUtility class in the

System.Web namespace. The additions and changes are detailed as follows:

Property/Method

Description

MachineName

Returns the name of the server.

ClearError

Clears the previous exception.

CreateObject

This method is now overloaded. The original form taking a string of the

ProgID is still allowed, as well as the new form taking a

Type object.

CreateObjectFromClsid

Creates an instance of a COM object from the Class identifier (

CLSID ).

Execute

This method is now overloaded. The original form taking a string of the path of the new request is still allowed, as well as the new form taking the path and a

TextWriter used to capture the output. This allows requests to be executed and then manipulated.

GetLastError

This now returns an

Exception object (as opposed to an

ASPError object in ASP).

HtmlDecode

Decodes an HTML encoded string.

HtmlEncode

This method is now overloaded, with an additional form taking a

string to encode and a

TextWriter into which the encoded text should be placed.

Transfer

This method is now overloaded, with an additional form taking a

string for the path, and a

Boolean to indicate whether or not the

Form and

QueryString collections should be preserved across the transfer.

UrlDecode

Decodes an HTML encoded URL.

UrlPathEncode

Encodes only the URL portion of a string (as opposed to

UrlEncode which encode the URL and any

QueryString ).

UrlEncode

This method is now overloaded, with an additional form taking a

string of the URL to encode, and a

TextWriter into which the encoded URL is placed.

The ASPError Object

The

ASPError object has been removed, as errors are now represented by exceptions. For example, the following code extracts the last error:

Dim lastError As Exception

lastError = Server.GetLastError()

Response.Write("Error was: " & lastError.Message)

The ObjectContext Object

The

ObjectContext object in ASP is designed for the integration of ASP pages with external transacted components, such as those in Microsoft Transaction Server (MTS) or COM+ Services. Within ASP.NET you have the ability to run pages with ASP Page Compatibility, by setting a page directive:

<%@ Page AspCompat="true" %>

This allows the page to be run on a single threaded apartment (STA) thread, allowing it to call STA components, such as those written in VB6. This is particularly useful for those components that reference the ASP intrinsic objects and generate HTML.

The Page Object

The

Page object (in the

System.Web.UI namespace) was not a part of ASP, but plays an important role in ASP.NET. The

Page is the parent object for the objects mentioned above, apart from the

ObjectContext . Many of the features of the page you'll already have seen (such as the

IsPostBack and

IsValid properties), and the rest are extensively documented in the help files. We mention this object here in case you see code such as

Page.Session ,

Page.Response , or

Page.Request , and wonder how the objects relate.

Page Changes

Along with changes to the common objects, the structure and usage of ASP pages have changed. You've already seen how the event model and postback architecture changes the layout of pages, so what you'll concentrate on here are the things that need changing from existing ASP pages.

Single Language Per Page

I've never actually seen any code that used more than one server-side language, but with ASP.NET you must use a single language per page. If you need to use multiple languages you'll have to use User Controls or custom controls, which can be in any language.

Note

The single language per page rule only affects individual pages – multiple pages in an application can be in different languages.

Script Blocks

Procedures in ASP.NET pages have to reside within proper script tags. So, the following is no longer allowed:

<%

Sub Foo()

...

End Sub

%>

Instead you must use:

<script language="VB" runat="server">

Sub Foo()

...

End Sub

</script>

You can still use the

<% %> tags for inline placement of variables or function results.

Code Render Functions

The changes to script block usage mean that render functions are no longer allowed. Render functions are where the body of a function actually contains HTML. For example:

<% Sub ShowSeparator() %>

<img src="/image/library/english/10209_/image/ library/english/10209_sep.gif" width="100%"></img>

<% End Sub %>

This now has to be:

<script language="VB" runat="server">

Sub ShowSeparator()

Response.Write("<img src='/image/library/english/10209_/image/ library/english/10209_sep.gif' width='100%'></img>")

End Sub

</script>