• Thứ Sáu, 09/01/2004 11:21 (GMT+7)

    Chuyển ứng dụng ASP sang môi trường ASP.NET

    Giới Thiệu

    Mặc dù các nhà thiết kế ASP.NET của Microsoft đã cố gắng xây dựng cho hệ thống này tương thích với ASP, nhưng để chạy được ứng dụng ASP trên môi trường ASP.NET, ta cần thực hiện một số bước chuyển đổi. Bài viết này không có tham vọng trình bày toàn diện đặc tính mới của ASP.NET mà chỉ tập trung vào những đặc tính quan trọng cần thiết cho việc chuyển đổi.
    Vì hầu hết các ứng dụng ASP đều sử dụng ngôn ngữ Microsoft Visual Basic Scripting Edition (VBScript) nên ta sẽ chọn ngôn ngữ Visual Basic.NET để chuyển sang ASP.NET. Bạn có thể chọn ngôn ngữ khác song sẽ đòi hỏi nhiều thời gian hơn, đôi khi còn phải thay đổi thiết kế và kiến trúc.

    Asp và asp.net cùng tồn tại như thế nào?

    Trước tiên chúng ta tìm hiểu sự tương thích và tích hợp của môi trường ASP với ASP.NET. Û́ng dụng ASP và ASP.NET có thể chạy song hành trên cùng một server mà không ảnh hưởng bất lợi lẫn nhau do đuôi file khác nhau (ASP là .asp, ASP.NET là .aspx); nhờ mô hình và cơ chế xử lý được tách biệt nhau.
    Ứng dụng của bạn có thể tích hợp từ một phần chạy trên ASP với phần khác chạy trên ASP.NET. Đây cũng là chiến lược mà các web site lớn sử dụng để nâng cấp dần lên ASP.NET mà không làm gián đoạn hoạt động của site.

    Sự Tương Thích Giữa Ngôn Ngữ Asp Và Asp.Net

    Chuyển ứng dụng từ ASP sang ASP.NET không quá khó nhưng cũng không đơn giản. ASP.NET tương thích với ASP và có thể nói ASP.NET là phiên bản nâng cấp hoàn chỉnh của ASP. ASP.NET ban đầu được thiết kế tương thích 100% với ASP, nhưng sau đó thiết kế này được thay đổi nhằm tạo ra một nền tảng mới thích hợp cho việc phát triển lâu dài. Những thay đổi trên ASP.NET là thiết yếu và tốt hơn so với ASP, đồng thời nó cũng không đòi hỏi nhiều công sức để triển khai. Những thay đổi gồm:

    • Thay đổi trong API

    • Thay đổi trong cấu trúc

    • Thay đổi liên quan đến COM

    • Thay đổi cấu hình ứng dụng

    • Thay đổi liên quan đến quản lý trạng thái

    • Thay đổi liên quan đến vấn đề bảo mật

    • Thay đổi cách truy xuất dữ liệu

    • Khác biệt giữa VBScript và Visual Basic.NET

     

    1. Thay đổi trong API

    Các hàm API của ASP bao gồm: Request, Response, Server... và một số hàm khác. Đa phần các hàm API này vẫn làm việc đúng trên ASP.NET, trừ 3 trường hợp sau:

    • Request(): ASP trả về một mảng chuỗi; ASP.Net trả về một tập biến chuỗi liên kết NameValueCollection.

    • Request.QueryString(): ASP trả về một mảng chuỗi; ASP.Net trả về một tập biến chuỗi liên kết NameValueCollection.

    • Request.Form():ASP trả về một mảng chuỗi; ASP.Net trả về một tập biến chuỗi liên kết NameValueCollection.

    Ví dụ, trong asp, giá trị của một chuỗi query từ request  http://localhost/test/test.asp?values=10&values=20 được truy xuất như sau:

    <%

    ‘ Giá trị xuất ra là 10

     Response.Write Request.QueryString(“values”)(1)

    ‘ Giá trị xuất ra là 20

    Response.Write Request.QueryString(“values”)(2)

    %>

     

    Trong ASP.NET, QueryString trả về đối tượng NameValueCollection, từ đối tượng này bạn lấy được tập giá trị của ‘values’ và từ đó lấy được giá trị mà bạn muốn. Một điều cần chú ý, phần tử đầu tiên được truy xuất là ‘0’ chứ không phải ‘1’ như ở ASP:

     

    <%

    ‘ Giá trị xuất ra là 10

     Response.Write (Request.QueryString.GetValues (“values”)(0))

    ‘ Giá trị xuất ra là 20

    Response.Write (Request.QueryString.GetValues (“values”)(1))

    %>

     

    Trong trường hợp sau, cách truy xuất của ASP và ASP.NET giống nhau:

     

    <% Giá trị trả về là “10”, “20”

    Response.Write(Request.QueryString (“values”))

    %>

     

    2. Thay đổi trong cấu trúc

    Sự thay đổi cấu trúc ảnh hưởng đến cách viết mã lệnh và bố cục các trang ASP. Bạn cần chú  ý một số thay đổi khi chuyển qua ASP.NET như sau:

    • Khai báo hàm và khai báo biến

    Trong ASP, bạn có thể khai báo hàm con và biến toàn cục giữa cặp thẻ <% %>

     

    <%

    Dim X,

    Dim mystring

    Sub MySub()

    Response.Write “Day la mot chuoi”

    End Sub

    %>

     

    Trong ASP.NET , bạn phải khai báo tất cả các biến và hàm bên  trong cặp thẻ <script> </script>

     

    <script language=”vb” runat=”server”>

    Dim x as String

    Dim x, y as Integer

    Function Add(I as Integer, J as Integer) As Integer

      Return (I + J)

    End Fuction

    </script>

     

    • Sự trộn lẫn các ngôn ngữ lập trình

    Trong ASP, chúng ta có 2 ngôn ngữ lập trình: VBScript và JScript. Chúng ta có thể trộn lẫn nhiều đoạn script trên cùng một trang.

    Trong ASP.NET, bạn có thể sử dụng nhiều ngôn ngữ lập trình khác nhau: C#, Visual Basic.NET (nền tảng .NET không hỗ trợ VBScript), JScript... Tuy nhiên, bạn không được trộn lẫn nhiều đoạn code với nhiều ngôn ngữ khác nhau trong cùng một trang giống như ASP, thay vào đó, trong một ứng dụng bạn có thể viết Page1.aspx với C#,  Page2.aspx với VisualBasic.NET. Nghĩa là trong một trang bạn không được sử dụng nhiều ngôn ngữ, nhưng bạn có thể gọi đến nhiều control được viết với nhiều ngôn ngữ khác nhau.

    • Dẫn xuất (directive)

    Trong ASP, bạn phải đặt tất cả các dẫn xuất ở dòng đầu tiên của một trang trong cùng cặp thẻ <% %>

     

    <%LANGUAGE=”VBSCRIPT” CODEPAGE=”932'%>

     

    Trong ASP.NET, bạn có thể đặt các dẫn xuất như sau:

     

    <%@Page Language=”VB” CodePage=”932'%>

    <%@OutputCatche Duration=”60' VaryByParam=”none”%>

     

    Bạn có thể đặt bao nhiêu dòng cho directive tuỳ ý, có thể đặt bất cứ nơi nào trong trang .aspx, tuy nhiên, để cho tiện, bạn nên đặt ở đầu của trang .aspx.

    • Không sử dụng các hàm Render 

    Hàm Render cơ bản là một thủ tục có chứa các thẻ lệnh HTML. Ví dụ:

     

    <% Sub RenderMe()

    %>

    <H3> This is HTML text being rendered</H3>

    <%End Sub

    RenderMe

    %>

     

    Kiểu mã lệnh trên khó đọc và khó quản lý vì vậy không được sử dụng trong ASP.NET. Cách đơn giản nhất để cho đoạn code trên chạy được trên ASP.NET là dùng Response.Write để xuất mã lệnh HTML:

     

    <script language=”vb” runat=”server”>

    Sub RenderMe()

     Response.Write(“<H3> This is HTML text being rendered </H3>”)

    End Sub

    </script>

     

    <%

    Call RenderMe()

    %>

     

    Tuy nhiên, với những dòng lệnh phức tạp, bạn nên dùng các web control, chúng cho phép tách biệt mã lệnh và nội dung, giúp dễ đọc hơn.

     

    3. Thay đổi liên quan đến COM (Component Object Model)

    Trong kiến trúc nền tảng .NET và ASP.NET, COM thực sự không có nhiều thay đổi. Điều này không có nghĩa bạn không cần bận tâm về những đối tượng COM và cách hoạt động của chúng khi sử dụng trên ASP.NET. Sau đây là vài điều cần lưu ý khi bạn muốn chuyển đổi một ứng dụng ASP có dùng COM sang ASP.NET:

    • Thay đổi của mô hình Threading:
    Mô hình Threading của ASP.NET hiện được áp dụng là mô hình Multiple Threaded Apartment (MTA). Điều này có nghĩa là những component bạn hiện sử dụng được tạo từ mô hình Single Threaded Apartment(STA) sẽ không xử lý hay thực thi một cách tin cậy nữa. Lúc này, bạn phải quan tâm đến một vài lưu ý khi chuyển những component đó sang ASP.NET. Ghi chú: Áp dụng điều này cho những component được tạo từ Visual Basic 6.0 hoặc những phiên bản trước nữa.

    • Thuộc tính ASPCOMPAT:

    Đây là tin vui cho những ai đang dùng các component STA  bởi vì bạn sẽ không phải thay đổi một dòng lệnh nào. Điều cần làm duy nhất ở đây là thêm thuộc tính tương thích “aspcompat=true” trong thẻ <%@Page> của trang ASP.NET. Sử dụng thuộc tính này buộc trang của bạn thực thi trong mô hình STA, nhờ vậy đảm bảo các component của bạn sẽ làm việc đúng. Nếu bạn cố gắng dùng component STA mà không khai báo thuộc tính này thì sẽ nhận những thông báo lỗi trong quá trình thực thi.

    Việc dùng thuộc tính này cũng cho phép trang của bạn gọi những component COM+ version 1.0 có truy cập đến những đối tượng xây dựng sẵn của ASP. Chúng được truy cập thông qua đối tượng ObjectContext.
    Lưu ý: việc dùng thuộc tính này sẽ làm giảm hiệu suất, do đó  chỉ nên dùng khi thực sự cần thiết.

    • Liên kết trước (Early Binding) và liên kết sau (Late Binding):

    Trong ASP, tất cả những yêu cầu gọi đến đối tượng component đều thông qua giao tiếp IDispatch, những yêu cầu gọi đến những đối tượng thực sự được xử lý gián tiếp thông qua IDispatch lúc thực thi, cơ chế này được là “late binding” (tạm dịch là liên kết sau). Khi áp dụng điều này trong ASP.NET, bạn vẫn có thể tiếp tục gọi các component theo cách cũ nếu thích.

    Ví dụ:

    Dim obj As Object

    obj = Server.CreateObject (“ProgID”) obj.MyMethodCall

     

    Tuy nhiên, cơ chế liên kết trước (early binding) trong ASP.NET cho phép bạn tạo trực tiếp đối tượng.

    Ví dụ:

     

    Dim obj As Object

    obj.MyMethodCall()

     

    Liên kết trước cho phép bạn tương tác với component theo cách thức an toàn và hiệu quả. Để dùng những tính năng liên kết trước với các component COM, bạn cần thêm một reference vào project giống như cách bạn thêm COM reference vào project Visual Basic 6.0. Trong trường hợp dùng Visual Studio.Net, một đối tượng gọi là proxy object được tạo bên trên component COM của bạn, tạo cảm giác bạn đang làm việc trực tiếp với component COM như là một component .NET.
    Về vấn đề hiệu suất, trong chừng mực nào đó có ảnh hưởng do có thêm lớp proxy object. Tuy nhiên, trong hầu hết trường hợp, điều này không phải là nhân tố có ý nghĩa, do số lượng mã lệnh CPU thực sự dành cho việc tương tác nhỏ hơn nhiều số lượng mã lệnh CPU cho những yêu cầu gọi IDispatch gián tiếp. Bạn được nhiều hơn là mất.    

    • Phương thức OnStartPage và OnEndPage:
    Nếu bạn muốn tiếp tục dùng phương thức truyền thống OnStartPage và OnEndPage để truy cập đến các đối tượng có sẵn của ASP, bạn cần phải dùng ASPCOMPAT và Server.CreateObject để tạo component dạng liên kết trước.
    Ví dụ: 

    Dim obj As MyObj

    obj = Server.CreateObject(MyObj)

    obj.MyMethodCall()

     

    Lưu ý, để hoạt động được, bạn phải thêm một reference vào project trong Visual Studio để chương trình tạo một class gọi là early-bound wrapper class. Dùng cách này chỉ trong trường hợp buộc phải sử dụng Server. CreateObject.

    • Tóm lại

    Tóm lại, dưới đây là những điều cần làm để tiếp tục sử dụng COM hiệu quả (xem bảng).

     

    4. Thay đổi cấu hình ứng dụng

    Để hiểu những thay đổi về cấu hình trên ASP.NET ta hãy xem lại cách cấu hình trên ASP. Trong ASP, tất cả thông tin về cấu hình của các ứng dụng web được lưu trữ trong registry của hệ thống và cơ sở dữ liệu của IIS. Điều này gây khó khăn khi cần xem hoặc thay đổi cấu hình vì thường công cụ quản trị không được cài đặt trên máy server.
    ASP.NET giới thiệu một mô hình cấu hình mới dựa trên những file XML đơn giản, cấu trúc dễ đọc. Mỗi ứng dụng ASP.NET có một file Web.config riêng được lưu trữ trong thư mục chính của ứng dụng. File cấu hình này giúp chúng ta có thể chủ động thay đổi cấu hình, hoạt động, và tính bảo mật của ứng dụng web.

    Một vài cấu hình mẫu trong file cấu hình như sau:

    <appSettings> Cấu hình ứng dụng.

    <authentication> Cấu hình hỗ trợ xác thực trên ASP.NET.

    <pages> Định dạng cấu hình trang.

    <processModel> Cấu hình tiến trình ASP.NET trên hệ thống IIS.

    <sessionState>        Xác định các tuỳ chọn trạng thái phiên làm việc.

     

    5. Thay đổi liên quan đến quản lý trạng thái:

    Nếu ứng dụng của bạn có dùng các đối tượng như Session hay Application để lưu thông tin về trạng thái, bạn vẫn cứ tiếp tục dùng chúng trên ASP.NET mà không phải lo lắng gì.

    • Tùy chọn: Trong ASP.NET, bạn có thêm chọn lựa cho mô hình lưu trữ trạng thái có khả năng quản lý hệ thống web farm (gồm nhiều máy chủ). Bạn thiết lập cấu hình những tùy chọn trên trong phần <sessionState> của file Web.config như sau:

     

    <sessionState

    mode=”Inproc”

    stateConnectionString = ”tcpip=127.0.0.1:42424'

    sqlConnectionString = ”datasource=127.0.0.1; user id=sa; password =”

    cookieless = ”false”

    timeout=”20'

    />

     

    Thuộc tính mode cho bạn biết nơi bạn muốn lưu những thông tin về trạng thái. Có những lựa chọn như: Inproc, StateServer, SqlServer hoặc Off.

    Inproc: Trạng thái Session được lưu trữ nội bộ trên server (cách của ASP).

    StateServer: Trạng thái Session được lưu trữ trong tiến trình dịch vụ trạng thái được đặt ở xa hay nội bộ.

    SqlServer: Trạng thái Session được lưu trữ trong CSDL SqlServer.

    Off: Không lưu trạng thái Session.

     

    • Lưu trữ COM: Một điều cần lưu ý là nếu bạn sử dụng cách lưu trữ những tham chiếu đến các thành phần COM truyền thống trong đối tượng Session hay Application, bạn không thể dùng cơ chế lưu trữ trạng thái mới (StateServer hoặc SqlServer) trong ứng dụng của mình. Bạn cần phải dùng đến Inproc. Đây là do yêu cầu một đối tượng có khả năng tự serializable trong thuật ngữ .NET, điều mà các thành phần COM không thể làm. Các component được quản lý (managed component) mới có thể thực hiện việc này và do vậy có thể dùng những mô hình lưu trữ trạng thái mới.

    • Chia sẻ trạng thái giữa ASP và ASP.NET

    Một vấn đề quan trọng khác cần xem xét là mặc dù ứng dụng của bạn có thể có cả ASP và ASP.NET, bạn cũng không thể chia sẻ biến trạng thái được lưu trữ trong đối tượng Session hay Application. Bạn cũng cần nhân đôi thông tin này cho cả hai hệ thống hoặc thực hiện điều chỉnh cho đến khi ứng dụng được chuyển đổi hoàn toàn.

    Tóm lại, nếu ít dùng các đối tượng Session và Application trong ứng dụng thì bạn sẽ không phải vất vả nhiều, ngược lại, bạn sẽ phải xử lý những cảnh báo và có thể phải dùng giải pháp ngắn hạn riêng để chia sẻ trạng thái.

     

    6. Thay đổi liên quan đến bảo mật:

    Bảo mật trên ASP.NET chủ yếu được thiết lập từ phần cấu hình bảo mật của file Web.Config. ASP.NET phối hợp với IIS để cung cấp một mô hình bảo mật đầy đủ cho ứng dụng. Những tính năng mới gồm:

    • Xác thực (Authentication)

    ASP.NET hổ trợ những tùy chọn kiểu khác nhau như sau:

    Windows: ASP.NET dùng cơ chế xác thực của Windows.

    Forms          form: đăng nhập dùng cookie.

    Passport: Dịch vụ Passport Service của Microsoft.

    None: Không thực hiện xác thực.

     

    • Cấp quyền (Authorization)

    Bạn có thể phân quyền sử dụng tài nguyên cho người dùng đã được xác thực.

    Ví dụ:

     

    <authorization>

    <allow users=”NORTHAMERICA\jkieley, REDMOND\jstegman”/>

    <deny users=”*”/>

    </authorization>

     

    • Ủy nhiệm (Impersonation):

    Trong ASP, sự ủy nhiệm cho phép ứng dụng của bạn chạy nhân danh một người dùng được xác thực. Lần lượt, người dùng có thể chạy ẩn danh dưới một xác nhận đặc biệt. Mặc định, ASP.NET không thực hiện việc ủy nhiệm theo từng yêu cầu. Điều này khác với ASP. Nếu bạn muốn dùng tính năng này, bạn cần kích hoạt tính ủy nhiệm trong file Web.config như sau:

     

    <identity>

    <impersonation enable = “true”/>

    </identity>

     

    7. Thay đổi cách truy xuất dữ liệu.

    Cách truy xuất dữ liệu là một trong những phần quan trọng bạn nên biết khi bắt tay vào việc chuyển đổi. Với sự ra đời  của ADO.NET, bạn có một cách mới để truy xuất dữ liệu. Đây là một vấn đề lớn, vượt ngoài phạm vi bài báo này. Tuy nhiên, trong hầu hết các trường hợp, bạn có thể sử dụng ADO để truy xuất dữ liệu như trong ASP. Nếu có thời gian, bạn nên tìm hiểu thêm về ADO.NET.

     

    8.  Khác biệt giữa Visual Basic Script và Visual Basic.NET

    Chuyển từ VBScript sang VB.NET là vấn đề thử thách nhất, ta sẽ tìm hiểu những khác biệt cần đặc biệt chú ý khi chuyền từ ASP sang ASP.NET.
    • Không còn sử dụng kiểu Variant: Các biến Variant không phải là một phần của .NET, nó không được hỗ trợ trong .NET. Điều đó có nghĩa là tất cả các biến trong ASP sẽ tự động được chuyển qua kiểu Object thay cho kiểu Variant.
    • Kiểu Date của Visual Basic: Một kiểu biến Variant cần đặc  biệt chú ý đó là kiểu VT_DATE, trong Visual Basic nó được xem là kiểu Date và được lưu dưới dạng Double dùng 4 byte. Trong Visual Basic.NET, Date dùng kiểu CLR (Common Language Runtime) DateTime, được lưu dưới dạng 8 byte integer.
    Do trong ASP, biến có kiểu là Variant nên biến kiểu Date sẽ được biên dịch và có thể nó sẽ hoạt động bình thường. Tuy nhiên, trong một số trường hợp, bạn sẽ gặp sự cố khi kiểu bị biên dịch sai. Để giải quyết, bạn nên truyền kiểu dữ liệu Date vào COM object như giá trị long integer hoặc “ép kiểu” cho Date bằng cách dùng CLng.
    • Option Explicit được xem là mặc định: Trong ASP, ta có từ khoá Option Explicit, tuy nhiên, nó không được xem là mặc định. Trong VisualBasic.NET, Option Explicit được xem là mặc định, do đó tất cả các biến phải được khai báo. Nếu sử dụng từ khóa Option Strict, bạn bắt buộc phải khai báo kiểu cho tất cả các biến trong ứng dụng. Nếu không khai  báo kiểu cho các biến, nó sẽ được hiểu như kiểu Object. Để tối ưu ứng dụng, bạn nên khai báo biến và kiểu của nó.
    • Let và Set không còn được sử dụng: Các Object giờ có thể được gán trực tiếp ví dụ: MyObj1 = MyObj2. Bạn không cần sử dụng lệnh Set và Let, nếu trong ứng dụng của bạn có sử dụng thì phải bỏ đi.
    • Sử dụng dấu () để gọi hàm: Trong ASP, bạn có thể gọi hàm mà không cần sử dụng dấu ngoặc (), ví dụ: 

    Sub WriteData()

    Response.Write “This is Data”

    End Sub

    WriteData

     

    Trong ASP.NET bạn phải sử dụng dấu ngoặc () với tất cả các hàm bạn gọi. Đoạn code viết theo kiểu dưới đây sẽ làm việc trong cả 2 môi trường ASP và ASP.NET:

     

    Sub WriteData()

    Response.Write(“This  is Data”)

    End Sub

    Call WriteData()

     

    • Kiểu tham trị (ByVal) là mặc định: Trong Visual Basic, tất cả các đối số được truyền theo kiểu tham chiếu (ByRef). Trong VisualBasic.NET, kiểu truyền mặc định là tham trị (ByVal). Nếu bạn muốn khai báo một biến theo kiểu tham chiếu, bạn phải đặt từ khoá ByRef trước biến đó, ví dụ:

     

    Sub MyByRefSub (ByRef Value)

      Value = 53;

    End Sub

     

    • Không còn các thuộc tính mặc định (Default Properties): 

    Ví dụ:

     

    ‘ ASP Syntax

    Set Conn = Server.CreateObject(“ADODB.Connection)

    Conn.Open(“TestDB”)

    Set RS = Conn.Execute(“Select * from Product”)

    Response.Write RS(“Name”)

     

    ‘ ASP.NET Syntax

    Conn = Server.CreateObject(“ADODB.Connection)

    Conn.Open(“TestDB”)

    RS = Conn.Execute(“Select * from Product”)

    Response.Write (RS(“Name”).Value)

     

    • Các thay đổi trong kiểu dữ liệu: Trong ASP.NET, kiểu Integer là 32 bit, kiểu Long là 64 bit.

    • Xử lý lỗi (exception handling): Mặc dù kỹ thuật xử lý lỗi On Error Resume Next và On Error Goto vẫn được dùng trong ASP.NET, tuy nhiên, đó không phải là cách hay nhất. ASP.NET đã xây dựng tập xử lý lỗi có cấu trúc sử dụng các từ khoá Try, Catch, Finally. Nếu có thể, bạn nên chuyển qua sử dụng mô hình mới này.

     

    Kết Luận

    ASP.NET là một bước đột phá trong công nghệ của Microsoft. Nhưng còn nhiều ứng dụng và website lớn đã xây dựng dựa trên ASP, do đó việc tìm hiểu để duy trì ứng dụng hoạt động tốt trong môi trường .NET là cần thiết. Cũng có một số công cụ hỗ trợ chuyển đổi ASP sang ASP.NET (ví dụ như công cụ asp2aspx có thể tải về ở địa chỉ http://www.netcoole.com/asp2aspx), tuy nhiên bạn đừng mong đợi nhiều vì hiện chưa có công cụ nào hoàn thiện và có thể thực hiện hoàn toàn tự động.

    Bài viết được thực hiện dựa trên tài liệu MSDN.NET và kinh nghiệm thực tế. Dẫu biết con đường từ lý thuyết đến thực hành còn rất dài, hy vọng là bạn có thể tự nâng cấp được ứng dụng của mình. Nâng cấp có thể chỉ là giải pháp tạm thời hoặc có ý nghĩa với những dự án có thời gian thực hiện ngắn.


    Tạ Thị Nhật Hà - Đỗ Thị Thanh

    Paragon Solutions VietNam.

    ID: A0211_98