【问题标题】:How is a web application started? Where is the entry point (if there's one)?Web 应用程序是如何启动的?入口点在哪里(如果有的话)?
【发布时间】:2011-09-23 22:38:46
【问题描述】:

我正在使用 IIS 开发一些 Web 应用程序。我曾经相信每个应用程序都应该有一个入口点。但似乎 Web 应用程序没有。

我已经阅读了很多关于如何在 IIS 下构建 ASP.NET 应用程序的书籍和文章,但它们并没有解决我想知道的最明显和最基本的问题。

那么谁能告诉我 Web 应用程序是如何启动的?传统桌面应用程序和 Web 应用程序在工作范式(例如启动和终止逻辑)方面有什么区别。

非常感谢。

更新 - 1 - 23:14 2011/1/4

我目前的理解是:

当某个请求到达时,请求中包含的 URL 将被 IIS 提取。我猜 IIS 必须维护某种内部表,它将 URL 映射到磁盘上相应的物理目录。我们以如下网址为例:

http://myhost/webapp/page1.aspx

在上述内部表的帮助下,IIS 将在磁盘上定位 page1.aspx 文件。然后检查这个文件并找到代码隐藏代码文件。然后将构造适当的页面类实例,并以预定义的顺序调用在代码隐藏文件中定义的方法。这一系列方法调用的输出将是发送给客户端的响应。

更新 - 2 - 23:32 2011/1/4

URL 只不过是作为上述内部表的索引的标识符。有了这个索引,IIS(或任何类型的 Web 服务器技术)就可以找到资源的物理位置。然后通过一些提示(例如像 *.aspx 这样的文件扩展名),Web 服务器知道应该使用哪个处理程序(例如 asp.net ISAPI 处理程序)来处理该资源。选择的处理程序将知道如何解析和执行资源文件。

所以这也解释了为什么 Web 服务器应该是可扩展的。

【问题讨论】:

  • 不,URL 是资源定位器。它是一个比查找索引更抽象的概念,但与标识符 (URI) 的概念不同
  • 我想开始赏金,但尚未显示开始赏金按钮。
  • 每个开发人员都会在他自己的专业领域(JSP、ASP、PHP)中解释这一点。在 PHP 中,JSP 很明显,而在 ASP 中它有点含糊,我猜。试试inetmgr 到在 xp 0r 2003 中配置查找。工作很简单 - 网络服务器只提供静态文件(html、js、css)。当遇到 .php 或 .asp 之类的内容时,它会将其转发到转换/处理 php 的应用程序服务器等/asp 文件(包括数据库查询)到 html 并返回到 Web 服务器,该服务器又将其提供给浏览器。如果您想要 asp.net 应用程序入口点的具体详细信息,请搜索 asp.net page lifecycle

标签: iis


【解决方案1】:

这取决于您使用的语言和框架,但总的来说,有许多入口点将绑定到 HTTP 请求(例如通过 URL)。当服务器接收到与这些绑定之一匹配的请求时,将执行绑定的代码。

还可能有各种过滤器链和拦截器,根据请求的其他条件执行。服务器启动时可能还会执行一些设置代码。最终,仍然有一个入口点 - 服务器的 main() 函数 - 但从 Web 应用程序的角度来看,重要的是请求绑定。

根据问题编辑进行编辑

我从未使用过 IIS,但我会假设没有“查找表”,而是一些查找规则。我将通过在 Apache 服务器上调用 .jsp 页面来告诉你,这应该是基本相同的过程。

  1. webapp 被写入并放置在文件系统中 - 例如C:/www/mywebapp
  2. 给 Web 服务器一个配置规则,告诉它 URL 路径 /webapp/ 应该映射到 C:/www/mywebapp
  3. Web 服务器还配置为将 .jsp 文件识别为 JSP servlet
  4. Web 服务器收到对 /webapp/page1.jsp 的请求,将其分派到工作线程
  5. Web 服务器使用其映射规则来定位 C:/www/mywebapp/page1.jsp
  6. Web 服务器使用方法 serveRequest(request, response) 将 JSP 文件中的代码包装在一个类中并编译它(如果尚未编译)
  7. Web 服务器调用serveRequest 函数,现在是用户代码的入口点
  8. 用户代码完成后,Web 服务器向客户端发送响应,工作线程终止

这是最基本的系统 - 基于资源的 servlet(即 .jsp 或 .aspx 文件)。使用 MVC 框架等技术时,绑定规则会变得复杂得多,但基本概念是相同的。

【讨论】:

  • 感谢您的回复。我曾经写过一个CGI程序,当时逻辑很清楚。 Web 服务器程序调用我的 CGI 程序,它充当动态页面内容提供者。所以本质上关键点是一些IPC机制。而我的 CGI 程序只是一个带有 main() 入口函数的普通完整 C 程序。该程序可以单独运行。但是当谈到像 ASP.NET 这样的现代技术时,我不再是在编写一个完整的独立程序,而是一些类库。那么这个类库是如何发挥作用的呢?
  • IIS 将加载您的类库并调用其 URL 映射规则告诉它在发出请求时调用的任何方法。
【解决方案2】:

与 OrangeDog 在他的回答中提到的类似,在提供这些页面时会发生很多事情,甚至在您开始编写代码之前。

不仅在 asp.net mvc 中,而且在 asp.net 中,当您执行请求时,通常会有各种不同的部分发挥作用。

模块、处理程序等代码会在到达页面代码之前再次进行处理。此外,您可以映射同一页面以处理不同的 url。

asp.net 中处理程序的概念很重要,因为有各种处理程序负责处理与扩展和/或 http 动词(get、head、post)匹配的请求。如果您查看 %systemroot%\Microsoft.NET\Framework64\v4.0.30319\Config\web.config,您可以看到一个部分。您还可以在 IIS 中查看处理程序(这些可以在 x 站点更改)。

例如,HttpForbiddenHandler 就是一个拒绝请求的处理程序。它被配置为调用特殊文件,如源“*.cs”。

您可以定义自己的处理程序,它只不过是一个实现 IHttpHandler 接口的类。所以它有 2 种方法:ProcessRequest 和 IsReusable。这更类似于您的 cgi 程序,因为实现主要是一种根据请求中的信息生成 HTML 或任何其他类型输出的方法。

Asp.net 页面建立在此之上,并具有许多额外的功能,旨在让您更轻松地开发页面。您实现了一个从 Page 继承的类,并且有 2 个与之关联的代码文件(.aspx 和 .cs)。对于 asp.net mvc 也可以这样说,但它的结构不同。远不止这些,如果你想利用它,你需要了解它。

这些抽象的缺点是,它使一些开发人员忘记了他们所处的/关于底层的上下文。上下文仍然相同,您正在生成一个接受请求并产生输出的应用程序。不同之处在于有更多的代码旨在使其更容易。

【讨论】:

    【解决方案3】:

    在更详细的 IIS 的 ASP.NET 请求生命周期列表方面,HTTPApplication Pipeline 中有相当多的阶段。 Faily 最近有一篇很好的博客文章,我认为它对它们进行了非常简洁和很好的总结。我是"HTTP Request Lifecycle Events in IIS Pipeline that every ASP.NET Developer Should Know" by Suprotim Agarwal

    如需更详细的解释,请check out the MSDN article on the subject。这也将涉及在该管道之前发生的事情的信息。

    【讨论】:

      猜你喜欢
      • 2020-05-12
      • 2019-03-21
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多