据我所知,网站项目即时编译源代码,Web应用程序项目预编译源代码到DLL(很像ASP.Net 1.x)。
但IIS中指定的差异如何?
我知道Visual Studio知道 - 每个都有不同的项目,等等。但是正在运行的实例(IIS + Framework)已经知道正在使用哪个编译模型,对吧?因为它如何知道是否即时编译?
请求进来,点击一个ASPX文件......以及该进程如何知道是否需要编译相关的CS文件(Web站点),或者是否在部署之前已经完成(Web应用程序)?
我只是好奇指出了这种差异。在web.config的某个地方?
答案 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知道。
您可以通过执行以下操作来证明这种情况:
将以下代码添加到Default.aspx.cs:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("hello");
}
编译项目,运行它,看看 文本“hello”出现在浏览器中。
现在,更改代码使其外观 像这样,并保存.cs文件:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("goodbye");
}
不要编译。刷新浏览器。你仍然会看到“你好”,因为编译的代码仍然使用这个字符串。
现在,将Default.aspx中的attrib从CodeBehind更改为CodeFile。保存此文件。
刷新浏览器。你会看到“再见”。
将代码中的“再见”更改为“我相信!”。保存.aspx.cs但不编译。
刷新浏览器,看到“我相信!”,然后在房间里跳舞: - )
答案 1 :(得分:3)
所有IIS都将传入的请求传递给适当的处理程序。对于ASP.NET站点/应用程序,它是aspnet_isapi.dll。处理程序然后从那里处理所有事情。
答案 2 :(得分:1)
编译网站或Web应用程序后,网络服务器没有区别。 IIS中的.NET处理程序始终:
在将站点完全编译为单个dll的场景中,仍有单行ASPX文件告诉IIS中的.NET处理程序在哪里获取代码。或者,可以通过web.conig中的一些额外配置行完全删除ASPX页面。
但简短的回答实际上是经过编译后才是相同的。
答案 3 :(得分:-2)
我非常确定框架处理这个问题,它对IIS是透明的。