Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

В файле .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 сообщает runtime, какой класс искать в двоичных файлах.

Атрибут CodeFile используется во время выполнения и используется aspnet_compiler.exe для генерации кода, а затем используется атрибут Inherits, как указано выше.

Подробнее об этих атрибутах смотрите здесь...

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

Но чтобы ответить на ваш вопрос "как IIS знает?" ответ "это не так". ASP.NET знает.

Вы можете доказать, что это так: сделайте следующее:

  • Создайте новое веб-приложение. Это будет включать Default.aspx и Default.aspx.cs.
  • Добавьте следующий код в Default.aspx.cs:

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

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

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

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

  • Обновите свой браузер. Вы увидите "прощай".

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

  • Обновите свой браузер, см. "Я верю!" и танцую по комнате просветить: -)

Ответ 2

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

Ответ 3

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

  • Скомпилируйте страницы ASPX.
  • Соедините собранные сборки во временной области.
  • Запустить запрос

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

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

Ответ 4

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