PDA

View Full Version : [Q] ASP.NET không chạy codebehind



White_Rose
29-05-2003, 07:00
Hic, test trên localhost thì không sao nhưng cứ upload lên host thì lại bị hỏng. Thử upload trực tiếp, dùng VS.NET (chả hiểu sao cứ upload project trên innerHOST thì lại báo lỗi, chỉ cho upload file) thì cũng bị lỗi sau:


Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately.

Parser Error Message: Could not load type 'ASPNET.ShowCounter'.

Source Error:


Line 1: <%@ Page language="c#" Codebehind="ShowCounter.aspx.cs" AutoEventWireup="false" Inherits="ASPNET.ShowCounter" %>



Source File: E:\web\bumcop\htdocs\whiterose\showcounter.aspx Line: 1

Có ai biết host nào có thể test được (free) hoặc làm thế nào để chạy được xin chỉ giúp với.

White_Rose
29-05-2003, 07:01
Hic, quên, đây là ví dụ
http://bumcop.www2.dotnetplayground.com/whiterose/showcounter.aspx

puppy
29-05-2003, 08:53
Sao kỳ vậy ta tui upload lên dotnetplayground chạy bình thường mà. Ông có upload thư mục bin lên không. Hay là ông gởi source cho tui tui upload lên thử xem :).

Thanks

White_Rose
29-05-2003, 12:19
Hic, upload hết rồi mà không chạy mới cú :(
OK! Bạn cho mình email, mình sẽ gửi code nhờ bạn.
Thanks.

puppy
29-05-2003, 15:54
Email đây nè.

kha@tblmedia.com

Thanks

buitrungtin
29-05-2003, 18:17
khà khà, xin lỗi nếu tôi hiểu sai.
bạn white Rose bất cẩn quá, bạn inherite cái thằng ASPNET.ShowCounter, Parser không kiếm được ASPNET.ShowCounter class nên báo lỗi chứ đâu phải nó không chạy code behide.

White_Rose
29-05-2003, 23:14
Mình không nghĩ là nó sai vì đã chạy thử ở nhà rồi. Mình nghĩ là do host nó config kiểu gì đó.
Mình upload 2 file .aspx và .aspx.cs lên đây, hy vọng các bạn giúp được (lúc trước nó hoạt động chính xác, bây giờ nó đếm lung tung do mình mới sửa lại phần cookie nhưng vẫn hiện được ảnh).
Nếu bị error, các bạn tạo thêm thư mục Counter trong thư mục chứa 2 file trên.
Thanks

zek3vil
29-05-2003, 23:49
Cái lỗi trên là do nó ko kiếm được cái class ShowCounter của bạn. Nếu bạn viết bằng VS.NET thì chắc chắn cái class của bạn đã được compile lại và nằm trong thư mục bin, bạn phải upload cái file ASPNET.dll của bạn lên thư mục bin của host thì mới được (ko cần phải upload file ShowCounter.aspx.cs). Bạn thử kiểm tra lại xem.

zek3vil
29-05-2003, 23:51
Nếu ko thì bạn nên kiểm tra lại xem host của bạn có hỗ trợ CodeBehind ko. Giống như Brinkster.com ko chấp nhận code behind cho free host.

White_Rose
30-05-2003, 01:27
Mình upload file dll đó lên rồi.
Vấn đề là puppy bảo là chạy được codebehind trên dotnetground nhưng mình thử thì lại không được. Vậy mới khó hiểu.

puppy
30-05-2003, 08:33
Chạy được mà.

Đây nè.

http://vokha.www2.dotnetplayground.com/ShowCounter.aspx

Thanks

Tui không sửa gì lại file của bạn. Chỉ compile và upload lên thôi.

puppy
30-05-2003, 08:37
Bài viết được gửi bởi zek3vil
Nếu ko thì bạn nên kiểm tra lại xem host của bạn có hỗ trợ CodeBehind ko. Giống như Brinkster.com ko chấp nhận code behind cho free host.

Brinkster.com vẫn cho chạy code behinde mà. Có điều bạn phải upload lên bằng VS.NET và upload toàn bộ project lên và đặt tên project của bạn theo qui ước sau username_***. Bạn coi lại trong FAQ của brinkster có hướng dẫn đó.

White_Rose
30-05-2003, 18:52
Bài viết được gửi bởi puppy
Brinkster.com vẫn cho chạy code behinde mà. Có điều bạn phải upload lên bằng VS.NET và upload toàn bộ project lên và đặt tên project của bạn theo qui ước sau username_***. Bạn coi lại trong FAQ của brinkster có hướng dẫn đó. Nhưng mình cũng thấy nó nói là với những host free (general) thì không support codebehind mà.

Hình như mình biết lỗi ở đâu rồi. dotnetplayground dùng .NET Framework 1.0 trong khi mình sử dụng VS.NET 2003 để compile (nó đi kèm .NET Framework 1.1)

zek3vil
30-05-2003, 21:51
Đúng vậy tui nghe nói dùng VS.NET upload lên thì được nhưng tui ko tài nào upload bằng cái VS.NET của tui được, có lẽ do cái connection có vấn đề.

À, White Rose, tui có 1 điều muốn hỏi là cái VS.NET 2003 có hơn cái 2002 nhiều ko, tui cũng muốn nâng cấp lên nhưng sợ có vấn đề với mấy cái project cũ. Ko biết có nên nâng cấp ko vây?

White_Rose
31-05-2003, 02:22
Dùng VS.NET 2003 mở các project cũ nói chung không có vấn đề (một số code trong C# có lẽ phải chỉnh lại tí xíu theo như thông báo của MS vì trong bản mới này, MS có sửa lại những lỗi hiện tại của C# trong VS.NET 2002 (những đặc tả về C# trong phiên bản mới nhất cũng có những sửa đổi đấy. Chắc bạn đọc tin này trong http://www.gotdotnet.com rồi).
Cái hơn dễ nhận ra nhất chính là namespace System.Data.Oracle (có trong toolbar về data luôn) và các control dành cho Mobile. Ngoài ra đi kèm nó là khá nhiều pack cho các component khác nhau (như SP1 cho MSDA 2.7)
Còn một cái, chỉ là cảm giác thôi, mình không dám nói chắc: VS.NET 2003 biên dịch nhanh hơn VS.NET 2002 và chiếm ít bộ nhớ hơn.

zek3vil
31-05-2003, 12:57
Cám ơn White_Rose nhiều lắm, như vậy có vẻ update lên phiên bản mới này cũng ko có nhiều rủi ro lắm, bạn có thể cho tui cái link đến cái trang mà nói về những thay đổi của C#ko? tui vài gotdotnet kiếm nhưng ko thấy.

White_Rose
01-06-2003, 04:32
Mình không thể tìm lại link, rất xin lỗi. Bài này mình tạm dịch từ lâu rồi, hy vọng giúp được ít nhiều cho bạn.

Ngôn ngữ Visual C# .NET 2003 thay đổi
December 30, 2002
Áp dụng cho Microsoft Visual Studio® C# 2003
Tóm tắt: Trong nỗ lực làm cho tương thích hoàn toàn với đặc tả European Computer Manufacturer's Association (ECMA) C#, Microsoft đẫ giới thiệu một vài thay đổi được triển khai đối với trình biên dịch C#. Những thay đổi này tác động đến sự không ổn định trên mã có sẵn, nó đặc biệt quan trọng đối với người sử dụng trong việc kiểm tra mã để đảm bảo rằng nó giải quyết trọng vẹn yêu cầu và điều này cũng đồng nghĩa ngôn ngữ lập trình C# được sử dụng như là một khuyến cáo.
Các nội dung:
Background
New C# Language Features
Implementation Changes
Conclusion
Background
Năm 2001, ngôn ngữ lập trình C# được thông qua bởi ECMA như là một chuẩn (ECMA-334). Để giữ cam kết của mình đối với các xử lý chuẩn của C# và giao diện ngôn ngữ chung (Common Language Interface - CLI), nhiều thay đổi đối với trình biên dịch C# đã được sử dụng để giữ lại cả ý nghĩa và chuẩn ECMA C#. Thêm vào đó, Microsoft cũng thêm vào các thay đổi trong quá trình triển khai C# (vẫn giữ đặc tả của chuẩn C#) để sửa những lỗi biên dịch và những lỗi mà các lập trình viên C# bắt gặp. Những thay đổi này là nguyên nhân code viết trong Visual C# .NET 2002 sinh ra bởi trình biên dịch cần sửa đổi đối chút để sử dụng trong Visual C# .NET 2003.
New C# Language Features
Hai đặc tính mới được thêm vào ngôn ngữ C# trong Visual C# .NET 2003. Đầu tiên, trình biên dịch chấp nhập chỉ dẫn tiền xử lý #line hidden. Được sử dụng chính bởi bộ sinh mã nguồn, chỉ dẫn này báo cho trình biên dịch để nó bỏ qua thông tin gỡ rối đối với tất cả các dòng mã nằm ngay sau #line hidden cho đến khi gặp chỉ dẫn #line. Trong ví dụ sau, trình biên dịch sẽ tạo ra code IL với câu lệnh WriteLine mà không chứa bất kì thông tin gỡ rối nào. Thực hiện điều này, các ứng dụng khi gỡ rối sẽ bỏ qua đoạn mã “hidden”.
public class Customer
{
public static void Main()
{
MyClass c = new MyClass();

c.ExecuteCommand();

#line hidden
Console.WriteLine("Display some text");
Console.WriteLine("Display some text");
Console.WriteLine("Display some text");
#line

c.ProcessCommand();

c.Close();
}
}
Tuy nhiên, chỉ dẫn #line hidden không giấu được các lỗi đối với trình biên dịch. Trình biên dịch vẫn biên dịch mã thành IL và mã vẫn được thực thi. Nó chỉ đơn giản ngăn cản debugger thực hiện gỡ rối từng bước một đối với nội dung bên trong.
Đặc tính thứ hai liên quan đến XML Comment và được thêm vào chuẩn ECMA. Bây giờ, C# hỗ trợ XML Comment bên trong các comment nhiều dòng sử dụng /* và */. Đoạn comment sau được sinh ra với trình biên dịch C#:
/**
<summary>This is a
comment

</summary>
*/
Do đó, với mục đích tiện lợi (không có nghĩa đây là khuyến cáo sử dụng), các lập trình viên có thể trộn lẫn và so sánh các kiểu comment và vẫn viết mã XML Comment có giá trị. Để thực hiện điều này, đoạn khai báo comment sau bây giờ là hợp lệ.
/**
<summary>This is a
comment
*/
/// </summary>
Implementation Changes
Bộ sinh mã 2003 của trình biên dịch C# có một vài ứng xử hơi khác so với phiên bản 2002 trong một vài tình huống thực tế. Nó có thể là nguyên nhân một số đoạn mã sẽ không được biên dịch hoặc cư xử khác đi khi thực thi.
Changes to the "Foreach" Statement
Câu lệnh foreach bây giờ kiểm tra động đối với sự có mặt của interface IDisposable trong cấu trúc dữ liệu mà nó duyệt. Trước đây, trình biên dịch không bao giờ kiểm tra động đối với interface IDisposable trừ phi kiểu trả về từ hàm GetEnumerator đã thi hành interface IEnumerator. Tuy nhiên, nếu kiểu được biết như là một kiểu tĩnh thi hành interface IDisposable, trình biên dịch luôn luôn gọi Dispose. Nói một cách khác, nếu kiểu được lặp triển khai theo enumerator design pattern nhưng không chỉ rõ interface IEnumerator, trình biên dịch sẽ không gọi phương thức Dispose trừ phi kiểu iterator là kiểu tĩnh triển khai interface IDispose.
Bây giờ, với việc kiểm tra interface IDisposable không cần quan tâm đến việc thi hành IEnumerator, trình biên dịch sẽ gọi phương thức Dispose nếu nó được thi hành. Trong ví dụ sau, Dispose sẽ không được gọi trong Visual C# .NET 2002 nhưng lại được gọi trong the Visual C# .NET 2003:
abstract class Base
{
public int Current { get; }
public bool MoveNext();
}

class Derived: Base, IDisposable
{
// implementation of both Base and IDisposable
}

class MyClass
{
public Base GetEnumerator()
{
return new Derived();
}
}
Trong khi câu lệnh foreach sử dụng lặp qua một tập hợp các object, nó thi hành method GetEnumerator và nhận về một instance có kiểu Derived (xuất phát từ kiểu Base và điều khiển lặp của riêng nó). Kiểu Base tất nhiên không cần thi hành interface IEnumerator để các method Current và MoveNext có thể được gọi. Trong các trình dịch cũ, phương thức Dispose của kiểu Derived không được gọi vì nó không thi hành IEnumerator và bởi vì class Base không phải là class tĩnh triển khai IDisposable. Trong trình biên dịch mới, phương thức Dispose được gọi bởi vì trình biên dịch kiểm tra sự có mặt của interface IDisposable trên tất cả các câu lệnh foreach. Bởi vì kết quả lời gọi GetEnumerator là kiểu Derived xuất phát từ kiểu Base và bởi vì kiểu Derived thi hành interface IDisposable , trình biên dịch kiểm tra động sự có mặt của interface IDisposable để gọi phương thức Dispose.
Changes to Property Declarations
Chuẩn ECMA C# chỉ rõ ra rằng không được tạo ra các hàm get và set đối với các thuộc tính tương ứng. Thực tế, trình biên dịch C# chuyển một khai báo thuộc tính thành các hàm get và set để các ngôn ngữ không hỗ trợ thuộc tính vẫn có thể truy xuất dữ liệu. Hiểu theo nghĩa hẹp, đoạn code sau là sai vì trình biên dịch tạo ra các phương thức get_Prop và set_Prop để tránh va chạm với các khai báo của người sử dụng:
public class MyClass
{
public int Prop
{
get
{
}

set
{
}
}

// illegal function now
public int get_Prop()
{
}

// illegal function now
public void set_Prop(int val)
{
}
}
Trước đây, trình biên dịch C# cho phép tạo ra những hàm như thế này và rõ ràng đó là một lỗi. Bộ sinh code 2003 của trình biên dịch C# đã sủa lại sai sót này.
Như một điều tất yếu đối với sự chính xác của trình biên dịch, trình biên dịch C# cũng không cho phép chỉ rõ việc tạo các hàm get và set khi thuộc tính được định nghĩa như là kết quả của việc triển khai interface. Trong ví dụ sau, phiên bản 2003 của trình biên dịch không cho phép thi hành các phương thức IMyInterface.get_Prop và IMyInterface.set_Prop trong class Derived:
interface IMyInterface
{
public int Prop { get; set; }
}

public class Derived : IMyInterface
{
public int Prop
{
get
{
}

set
{
}
}

// illegal
public int IMyInterface.get_Prop()
{
}

// illegal
public void IMyInterface.set_Prop(int val)
{
}
}
Other Changes
Phiên bản trước của trình biên dịch C# cho phép sử dụng các attribute. Điều này đã được sử lại để trình biên dịch C# tương thích tốt hơn với đặc tả ECMA. Cái đầu tiên được sửa là trình biên dịch C# không cho phép đặt tên các parameter trong danh sách đối số mà không khai báo trong phần khai báo attribute của class. Ví dụ nếu class AuthorAttribute được tạo với một private field có tên là authorName, đoạn lệnh sau được phép nếu biên dịch trong các phiên bản trước của C# nhưng bây giờ, kết quả nhận được sẽ là một lỗi”
[Author(authorName="microsoftuser")]
public class MyClass
{
}
Thứ hai, ObsoleteAttribute bây giờ có thể áp dụng cho các toán tử với những lập trình viên có thể không tán thành các hàm nạp chồng toán tử (overloaded operator functions). Cuối cùng, ở những nơi trình biên dịch thường sinh một lỗi đối với một vùng thuộc tính không được nhận dạng (unrecognized attribute location) thì bây giờ, nó chỉ phát sinh một cảnh báo theo yêu cầu của đặc tả ECMA C#.
Thêm vào đó, trình biên dịch C# cho phép định nghĩa các toán tử shift (>> và <<) theo bất kì cách nào của người sử dụng và điều này là không hợp lệ khi so sánh với đặc tả ECMA C#. Toán tử shift có thể được khai báo với một thể hiện của class như một toán hạng:
public class MyClass
{
public static MyClass operator <<(int I, MyClass c)
{
}

public static void Main()
{
}
}
Đối chiếu với đặc tả, nếu toán tử left shift được nạp đè, đối số đầu tiên trong danh sách toán hạng phải kèm theo. Tương tự, nếu toán tử right shift được nạp đè, đối số thứ hai trong danh sách toán hạng phải kèm theo. Đoạn code sau minh hoạ cách triển khai:
public class MyClass
{
public static MyClass operator <<( MyClass c, int i)
{
}

public static void Main()
{
}
}
Cuối cùng, một số sửa đổi sau đã kết hợp chặt chẽ sự chính xác của trình biên dịch:
· Chính xác trong việc định nghĩa thuật toán gán để trình biên dịch không còn đưa ra thông báo lỗi nữa và cũng chính xác khi đối chiếu với đặc tả ECMA C#.
· Kiểu Enumerated bây giờ có thể chuyển thành các kí tự theo như đặc tả.
· Các cảnh báo ảo bên trong (internal virtual warning) đã bị loại bỏ khi các internal virtual functions không còn bị ghi đè từ bên ngoài assembly nữa.
Conclusion
Trình biên dịch C# thi hành một vài đặc tính khác để có được hiệu suất tốt hơn phiên bản trước. Không một thay đổi nào ảnh hưởng đến sự biên dịch hay thực thi của mã.
· Khi lặp qua các phần tử của string, câu lệnh foreach bây giờ sử dụng indexer của string thay vì sử dụng enumerator pattern, kết quả là hiệu suất cao hơn.
· Trình biên dịch C# bây giờ tương thích nhiều hơn với các lệnh quản lý dấu chấm động và các thuật toán số học trong đặc tả ECMA C#.
· Một vài lỗi được sửa đề tối ưu luồng điều khiển của chương trình.

puppy
02-06-2003, 08:34
Bài viết được gửi bởi puppy
Brinkster.com vẫn cho chạy code behinde mà. Có điều bạn phải upload lên bằng VS.NET và upload toàn bộ project lên và đặt tên project của bạn theo qui ước sau username_***. Bạn coi lại trong FAQ của brinkster có hướng dẫn đó.

Hic, Tui mới coi lại brinkster nó không cho upload code behind nữa. Sorry.

Chắc là phải tìm host khác để test .NET thui.