IIS如何知道它是在为Web站点还是Web应用程序项目提供服务?

Dea*_*ane 12 asp.net iis compilation

据我所知,网站项目即时编译源代码,Web应用程序项目预编译源代码到DLL(很像ASP.Net 1.x).

但是如何在IIS中指定差异?

我知道Visual Studio知道 - 每个都有不同的项目,等等.但是运行实例(IIS + Framework)必须知道正在使用哪个编译模型,对吧?因为它如何知道是否即时编译?

请求进来,命中ASPX文件...以及进程如何知道是否需要编译关联的CS文件(Web站点),或者是否在部署之前已经完成(Web应用程序)?

我只是好奇指出了这种差异.在web.config的某个地方?

Mar*_*eck 21

您可以在这些项目类型中找到.aspx文件中的细微差别.

如果你看一个网站项目,你应该看到这样的东西......

<%@ Page Language="C#" AutoEventWireup="true"  
CodeFile="Default.aspx.cs" Inherits="_Default" %>
Run Code Online (Sandbox Code Playgroud)

...作为Web应用程序项目将具有类似这样的.aspx文件...

<%@ Page Language="C#" AutoEventWireup="true" 
CodeBehind="Default.aspx.cs" Inherits="WebApplication2._Default" %>
Run Code Online (Sandbox Code Playgroud)

请注意,第一个具有CodeFile属性,第二个具有CodeBehind属性.这就是区别所在.

CodeBehind属性不在运行时使用 - 它可以告诉VS.NET代码所在的位置,而Inherits属性告诉运行时要在二进制文件中搜索哪个类.

CodeFile属性在运行时使用,并由aspnet_compiler.exe用于生成代码,然后使用Inherits属性,如上所述.

有关这些属性的更多信息,请查看此处...

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

但要回答你的问题"IIS如何知道?" 答案是"它没有." ASP.NET知道.

您可以通过执行以下操作来证明这种情况:

  1. 创建一个新的Web应用程序.这将包括Default.aspx和Default.aspx.cs.
  2. 将以下代码添加到Default.aspx.cs中:

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("hello");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 编译项目,运行它,看到文本"hello"出现在浏览器中.

  4. 现在,更改代码使其看起来像这样,并保存.cs文件:

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("goodbye");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 不要编译.刷新浏览器.你仍然会看到"你好",因为编译后的代码仍然使用这个字符串.

  6. 现在,将Default.aspx中的attrib从CodeBehind更改为CodeFile.保存此文件.

  7. 刷新浏览器.你会看到"再见".

  8. 将代码中的"再见"改为"我相信!".保存.aspx.cs但不编译.

  9. 刷新您的浏览器,看到"我相信!",并在房间里跳舞:-)