Как IIS узнает, обслуживает ли он веб-сайт или проект веб-приложения?

Я понимаю, что проекты веб-сайтов компилируют исходный код на лету, а проекты веб-приложений предварительно компилируют исходный код в DLL (очень похоже на ASP.Net 1.x).

Но как разница указана в IIS?

Я знаю, что Visual Studio знает - для каждого есть разные проекты и т. д. Но работающий экземпляр (IIS + Framework) должен знать, какая модель компиляции используется, верно? Потому что, как еще он знает, стоит ли компилировать на лету?

Приходит запрос, попадает в файл ASPX ... и как процесс узнает, нужно ли скомпилировать связанный файл CS (веб-сайт) или это уже было сделано до развертывания (веб-приложение)?

Мне просто любопытно, где указана эта разница. Где-нибудь в web.config?

12 голосов | спросил Deane 8 Mayam09 2009, 00:15:51

4 ответа


0

В файле .aspx есть небольшая разница, которую вы найдете в этих типах проектов.

Если вы посмотрите на проект веб-сайта, вы должны увидеть что-то вроде этого ...

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

... где в проекте веб-приложения будут файлы .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. Создайте новое веб-приложение. Это будет включать Default.aspx и Default.aspx.cs.
  2. Добавьте следующий код в Default.aspx.cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("hello");
    }
    
  3. Скомпилируйте проект, запустите его, посмотрите текст "привет" появится в браузере.

  4. Теперь измените код так, чтобы он выглядел вот так и сохраните файл .cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("goodbye");
    }
    
  5. НЕ СОБИРАТЬ. Обновите ваш браузер. Вы все равно увидите «привет», потому что скомпилированный код все еще использует эту строку.

  6. Теперь измените атрибут в Default.aspx с CodeBehind на CodeFile. Сохраните этот файл.

  7. Обновите ваш браузер. Появится сообщение «до свидания».

  8. Измените "до свидания" в своем коде на "Я верю!" Сохраните .aspx.cs, но не компилируйте.

  9. Обновите свой браузер, посмотрите «Я верю!» и танцуйте вокруг комнаты: -)

ответил Martin Peck 8 Mayam09 2009, 01:00:34
0

Все, что делает IIS - это передает входящий запрос соответствующему обработчику. В случае сайта /приложения ASP.NET это aspnet_isapi.dll. Затем обработчик позаботится обо всем.

ответил Colin Cochrane 8 Mayam09 2009, 00:22:03
0

После компиляции веб-сайта или веб-приложения для веб-сервера нет никакой разницы. Обработчики .NET в IIS всегда:

  1. Скомпилируйте страницы ASPX.
  2. Вставьте собранные сборки в область временных файлов.
  3. Запустите запрос

В тех случаях, когда сайт полностью скомпилирован в одну DLL, все еще существуют однострочные ASPX-файлы, сообщающие обработчикам .NET в IIS, где взять код. Или страницы ASPX могут быть удалены вместе с некоторыми дополнительными строками конфигурации в web.conig.

Но краткий ответ действительно один раз скомпилирован, они идентичны.

ответил David McEwing 8 Mayam09 2009, 00:20:46
0

Я уверен, что фреймворк справится с этим, и он прозрачен для IIS.

ответил Jimmie R. Houts 8 Mayam09 2009, 00:17:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132