How does IIS know if it's serving a Web Site or a Web Application project?

后端 未结 4 954
日久生厌
日久生厌 2021-02-01 08:58

I understand that Web Site Projects compile source on-the-fly, and Web Application Projects pre-compile source into a DLL (much like ASP.Net 1.x).

But how is the differe

4条回答
  •  半阙折子戏
    2021-02-01 10:02

    There is a subtle difference in the .aspx file that you'll find in these project types.

    If you look at a Web Site Project you should see something like this...

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

    ... where as the Web Application project will have .aspx files with something like this...

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

    Notice that the first has a CodeFile attribute, and the second as a CodeBehind attribute. This is where the distinction is made.

    The CodeBehind attribute is NOT used at runtime - it's there to tell VS.NET where the code lives, and the Inherits attribute tells the runtime which class to go searching for in the binaries.

    The CodeFile attribute IS used at runtime, and is used by the aspnet_compiler.exe to generate code, and then the Inherits attribute is used as above.

    For more info on these attributes, look here...

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

    But to answer your question "how does IIS know?" the answer is "it doesn't." ASP.NET knows.

    You can prove that this is the case by doing the following:

    1. Create a new web application. This will include a Default.aspx and a Default.aspx.cs.
    2. Add the following code into Default.aspx.cs:

      protected void Page_Load(object sender, EventArgs e)
      {
          Response.Write("hello");
      }
      
    3. Compile the project, run it, see the text "hello" appear in a browser.

    4. Now, change the code so it looks like this, and save the .cs file:

      protected void Page_Load(object sender, EventArgs e)
      {
          Response.Write("goodbye");
      }
      
    5. DO NOT COMPILE. Refresh your browser. You'll still see "hello" because the compiled code still uses this string.

    6. Now, change the attrib in Default.aspx from CodeBehind to CodeFile. Save this file.

    7. Refresh your browser. You'll see "goodbye" displayed.

    8. Change "goodbye" in your code to "I believe!". Save the .aspx.cs but don't compile.

    9. Refresh your browser, see "I believe!", and dance around the room enlightend :-)

提交回复
热议问题