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

时间:2009-05-07 20:15:51

标签: asp.net iis compilation

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

但IIS中指定的差异如何?

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

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

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

4 个答案:

答案 0 :(得分:21)

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

如果您查看网站项目,您应该看到类似的内容......

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

...在哪里,Web应用程序项目将包含类似这样的.aspx文件......

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

请注意,第一个具有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");
    }
    
  3. 编译项目,运行它,看看 文本“hello”出现在浏览器中。

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

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

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

  7. 刷新浏览器。你会看到“再见”。

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

  9. 刷新浏览器,看到“我相信!”,然后在房间里跳舞: - )

答案 1 :(得分:3)

所有IIS都将传入的请求传递给适当的处理程序。对于ASP.NET站点/应用程序,它是aspnet_isapi.dll。处理程序然后从那里处理所有事情。

答案 2 :(得分:1)

编译网站或Web应用程序后,网络服务器没有区别。 IIS中的.NET处理程序始终:

  1. 编译ASPX页面。
  2. 将构建的程序集Jit到临时文件区域。
  3. 运行请求
  4. 在将站点完全编译为单个dll的场景中,仍有单行ASPX文件告诉IIS中的.NET处理程序在哪里获取代码。或者,可以通过web.conig中的一些额外配置行完全删除ASPX页面。

    但简短的回答实际上是经过编译后才是相同的。

答案 3 :(得分:-2)

我非常确定框架处理这个问题,它对IIS是透明的。