2009-05-07 4 views
12

Tôi hiểu rằng các Dự án Trang web biên dịch nguồn trực tiếp và các Dự án Ứng dụng Web được biên dịch trước thành một tệp DLL (giống như ASP.Net 1.x).Làm thế nào để IIS biết nếu nó phục vụ một trang Web hoặc một dự án ứng dụng Web?

Nhưng sự khác biệt được chỉ định trong IIS như thế nào?

Tôi biết rằng Visual Studio biết - có các dự án khác nhau cho từng, v.v. Ví dụ chạy (IIS + Framework) để biết mô hình biên dịch nào đang được sử dụng, đúng không? Bởi vì làm cách nào để biết liệu có nên biên dịch trực tiếp không?

Yêu cầu đến, truy cập tệp ASPX ... và quy trình biết liệu tệp CS liên quan có cần phải được biên dịch (Trang web) hay không hoặc đã được thực hiện trước khi triển khai (Ứng dụng web) chưa?

Tôi chỉ muốn biết sự khác biệt này được chỉ định ở đâu. Trong web.config ở đâu đó?

+1

Daren nếu bạn muốn biết bỏ phiếu lên câu hỏi –

Trả lời

21

Có một sự khác biệt tinh tế trong file .aspx mà bạn sẽ tìm thấy trong các loại dự án.

Nếu bạn nhìn vào một dự án trang web bạn sẽ thấy một cái gì đó như thế này ...

<%@ Page Language="C#" AutoEventWireup="true" 
CodeFile="Default.aspx.cs" Inherits="_Default" %> 

... nơi như các dự án ứng dụng Web sẽ có các file .aspx với một cái gì đó như thế này ...

<%@ Page Language="C#" AutoEventWireup="true" 
CodeBehind="Default.aspx.cs" Inherits="WebApplication2._Default" %> 

Lưu ý rằng thuộc tính đầu tiên có thuộc tính CodeFile và thuộc tính thứ hai là thuộc tính CodeBehind. Đây là nơi phân biệt được thực hiện.

Thuộc tính CodeBehind KHÔNG được sử dụng trong thời gian chạy - nó có để nói cho VS.NET biết mã ở đâu và thuộc tính Inherits cho biết thời gian chạy lớp nào sẽ tìm kiếm trong tệp nhị phân.

Thuộc tính CodeFile IS sử dụng trong thời gian chạy, và được sử dụng bởi aspnet_compiler.exe để tạo ra mã, và sau đó là thuộc tính Inherits được sử dụng như trên.

Để biết thêm về những thuộc tính này, nhìn ở đây ...

http://msdn.microsoft.com/en-us/library/ydy4x04a.aspx

Nhưng để trả lời câu hỏi của bạn "như thế nào IIS biết?" câu trả lời là "nó không." ASP.NET biết.

Bạn có thể chứng minh rằng đây là trường hợp bằng cách làm như sau:

  1. Tạo một ứng dụng web mới. Điều này sẽ bao gồm một Default.aspx và một Default.aspx.cs.
  2. Thêm đoạn mã sau vào Default.aspx.cs:

    protected void Page_Load(object sender, EventArgs e) 
    { 
        Response.Write("hello"); 
    } 
    
  3. Biên dịch dự án, chạy nó, thấy văn bản "hello" xuất hiện trong trình duyệt.

  4. Bây giờ, thay đổi mã để nó trông như thế này, và lưu cs file:

    protected void Page_Load(object sender, EventArgs e) 
    { 
        Response.Write("goodbye"); 
    } 
    
  5. không biên dịch. Làm mới trình duyệt của bạn. Bạn vẫn sẽ thấy "hello" vì mã được biên dịch vẫn sử dụng chuỗi này.

  6. Bây giờ, thay đổi người nhận trong Default.aspx từ CodeBehind thành CodeFile. Lưu tệp này.

  7. Làm mới trình duyệt của bạn. Bạn sẽ thấy "tạm biệt" hiển thị.

  8. Thay đổi "tạm biệt" trong mã của bạn thành "Tôi tin!". Lưu tệp .aspx.cs nhưng không biên dịch.

  9. Refresh trình duyệt của bạn, xem "Tôi tin!", Và nhảy múa quanh phòng enlightend :-)

+0

Giả sử điều này là chính xác, đó là * chính xác * những gì tôi đang tìm kiếm. Tôi * biết * phải có một số thiết lập nhỏ ở đâu đó ... – Deane

+0

Vì vậy, hãy dùng thử. Thực hiện một dự án ứng dụng web, thay đổi tệp .aspx để có một CodeFile attrib thay vì một CodeBehind attrib, và xem liệu bạn có thể chỉnh sửa .cs trên một trang web trực tiếp và thấy sự khác biệt mà không sử dụng VS.NET để biên dịch mã. Tôi chỉ làm bài kiểm tra này và chứng minh điều đó là đúng. –

+0

Tôi đã chỉnh sửa câu trả lời của mình bằng một số bước "cách thử". –

-2

Tôi chắc rằng khuôn khổ xử lý này và nó là trong suốt đối với IIS.

+0

Nhưng làm thế nào khuôn khổ biết? Một nơi nào đó, trên máy chủ Web sản xuất, phải có một số thiết lập hoặc cờ nói rằng "biên dịch trực tiếp" hoặc "không, bởi vì tất cả trong đó DLL trên đó." – Deane

1

Khi trang web hoặc webapplication được biên dịch không có sự khác biệt cho máy chủ web. Trình xử lý .NET trong IIS luôn:

  1. Biên dịch các trang ASPX.
  2. Jit các cụm được xây dựng vào khu vực tệp tạm thời.
  3. Chạy theo yêu cầu

Trong kịch bản mà trang web được biên soạn hoàn toàn vào một dll đơn có một trong hai vẫn còn dòng ASPX file nói với xử lý NET trong IIS nơi để lấy mã. Hoặc các trang ASPX có thể được gỡ bỏ hoàn toàn với một số dòng cấu hình bổ sung trong web.conig.

Nhưng câu trả lời ngắn gọn là thực sự một lần biên soạn chúng giống hệt nhau.

+0

Tôi nhận ra chúng giống hệt nhau, nhưng làm thế nào để IIS (hoặc khung công tác - bất cứ điều gì) biết rằng các tệp .cs trong gốc Web đã được biên dịch thành một DLL trong thùng ... hay không? – Deane

+0

Không. Người xử lý chăm sóc nó và xử lý nó giống nhau mọi lúc. Nếu mã phía sau được chỉ định trong chỉ thị @Page aspx thì trình xử lý rõ ràng sẽ cần phải tuân thủ điều đó trước tiên. Trong VS ở đó về cơ bản nó là một sự khác biệt về mặt khái niệm, nhưng một khi nó được triển khai tới IIS, bộ lọc aspnet_isapi xử lý chúng giống nhau. –

3

Tất cả IIS làm là vượt qua các yêu cầu gửi đến xử lý thích hợp. Trong trường hợp của một trang ASP.NET/ứng dụng nó là aspnet_isapi.dll. Người xử lý sau đó sẽ chăm sóc mọi thứ từ đó.

+0

Bạn có thể xem/chỉnh sửa/xác nhận liên kết này trong quản trị viên IIS: mở thuộc tính của trang web hoặc thư mục ảo, chọn tab Thư mục chính, nhấp vào nút Cấu hình (dưới cùng bên phải), tab Ánh xạ. –