Ни один из моих кодов кода не вызывается - PullRequest
12 голосов
/ 02 февраля 2011

Я только что создал проект ASP.NET C # и виртуальный каталог для него в IIS (насколько я знаю) обычным способом, но я вижу очень странное поведение, которого я никогда раньше не видел.

Кажется, нет моих методов C # когда-либо вызывались.Я знаю это, потому что я переопределил кучу методов, которые ничего не делают, кроме как генерируют исключение.По крайней мере Default.aspx можно просмотреть в браузере (см. Ниже)

Вот точное содержимое моего файла Default.aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Drawings2
{
    public partial class _Default : System.Web.UI.Page
    {
        static _Default()
        {
            throw new Exception("XXX");
        }
        public _Default()
        {
            throw new Exception("XXX");
        }
        override protected void OnInit(EventArgs e)
        {
            /*
             * base.OnInit(e);
             * InitializeComponent();
             */
            throw new Exception("XXX");
        }
        private void InitializeComponent()
        {
            /*
             * Load += new EventHandler(this.Page_Load);
             */
            throw new Exception("XXX");
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            throw new Exception("XXX");
        }
    }

}

Я предполагаю, что этот код не используетсязагружен вообще, потому что если бы это было так, я бы увидел исключение всякий раз, когда я пытался просмотреть страницу в браузере.Вместо этого содержимое из файла .aspx отображается нормально (за исключением того, что мои обработчики событий не вызываются.)

Становится хуже, когда я пытаюсь добавить новые страницы .aspx.Я получаю эту ошибку при попытке просмотреть новую страницу в браузере (это происходит с неизмененным файлом .cs из шаблона VS2008): Ошибка синтаксического анализатора

Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. 

Parser Error Message: Could not load type 'Drawings2.WebForm1'.

Что может привести к тому, что сайт ASP.NETпопасть в это странное состояние?

Примечание: <%...%> экранирование в файле .aspx по-прежнему работает нормально.Также, когда я добавляю поля формы в файл .aspx, я могу автоматически заполнять их имена в файле .cs.Я пробовал оба true и false для AutoEventWireup на обеих страницах.Я также пытался добавлять и удалять «частичные» из всех объявлений классов.


Обновление - вот мои теги @Page.Как я уже сказал, я пытался переключить AutoEventWireup.Указанные .cs файлы существуют и компилируются без ошибок.

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

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Drawings2.WebForm1" %>

Связанные:

Ответы [ 9 ]

13 голосов
/ 02 февраля 2011

Попробуйте изменить:

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

до:

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

CodeBehind для визуальной студии. Я считаю, что CodeFile используется для JIT.

Другой вариант - скомпилировать проект и обновить сборку в каталоге bin.

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

CodeBehind Указывает имя скомпилированный файл, который содержит класс, связанный со страницей. это атрибут не используется во время выполнения.

Этот атрибут используется для Интернета прикладные проекты. CodeFile атрибут используется для веб-сайта проекты. Для получения дополнительной информации о Типы веб-проектов в Visual Studio, увидеть проекты веб-приложений по сравнению с Проекты веб-сайтов.

CodeFile Указывает путь к ссылочному файлу code-behind для стр. Этот атрибут используется вместе с атрибутом Inherits для ассоциировать исходный файл с выделенным кодом с веб-страницей. Атрибут действительно только для скомпилированных страниц.

Этот атрибут используется для веб-сайта проекты.

Атрибут CodeBehind используется для Проекты веб-приложений. Для большего информация о типах веб-проектов в Visual Studio, см. Веб-приложение Проекты против проектов веб-сайтов.

4 голосов
/ 20 марта 2011

Здесь много противоречивой информации. Например, если вы действительно создаете веб-приложение ASP.NET (в отличие от веб-сайта ), то вам не следует использовать CodeFile , как used2could предлагает .

Вы пытались проверить Build Action ваших файлов с выделенным кодом? Убедитесь, что он установлен на Compile .

Я думаю, что нам нужно начать с нуля, чтобы определить, связана ли проблема с вашим веб-проектом, вашей конфигурацией IIS или обоими.

Я собираюсь сделать следующие предположения о вашей настройке, потому что это моя текущая установка. Дайте мне знать, если что-то из этого не так, но это не должно иметь большого значения:

  • Вы используете Visual Studio 2010 с .NET 3.5
  • Ваш веб-сервер - Windows 2003
  • Ваш веб-сервер работает под управлением IIS 6.0

Создание нового проекта веб-приложения:

Давайте постараемся сделать это как можно более простым, чтобы минимизировать вероятность странностей:

  • Решение 'TestWebApp1'
    • Проект 'TestWebApp1' (веб-приложение ASP.NET)
      • Свойства
      • Ссылки
      • App_Data
      • Сценарии
      • Default.aspx (Действие сборки: Содержимое )
        • Default.aspx.cs (Действие сборки: Компиляция )
      • SiteLayout.Master (Действие по сборке: Содержимое )
        • SiteLayout.Master.cs (Действие сборки: Компиляция )
      • Web.config

Содержимое Default.aspx :

<%@ Page Title="" Language="C#" MasterPageFile="~/SiteLayout.Master"
    AutoEventWireup="true" CodeBehind="Default.aspx.cs"
    Inherits="TestWebApp1.Default" %>
<asp:Content ID="Content2" ContentPlaceHolderID="mainCPH" runat="server">
    <p><asp:Label ID="lblTest" runat="server">This is a test</asp:Label></p>
</asp:Content>

Содержимое Default.aspx.cs :

using System;
namespace TestWebApp1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            lblTest.Text = "Modified from Default.aspx's Page_Load method.";
        }
    }
}

Содержимое SiteLayout.Master :

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="SiteLayout.master.cs"
    Inherits="TestWebApp1.SiteLayout" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        <form id="form1" runat="server">
            <div>
                <p><asp:Label ID="lblTest" runat="server">This is a test</asp:Label></p>
                <asp:ContentPlaceHolder ID="mainCPH" runat="server">
                </asp:ContentPlaceHolder>
            </div>
        </form>
    </body>
</html>

Содержимое SiteLayout.Master.cs :

using System;
namespace TestWebApp1
{
    public partial class SiteLayout : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            lblTest.Text = "Modified from master page's Page_Load method.";
        }
    }
}

Теперь этот сайт должен работать в обязательном порядке при отладке на локальном компьютере:

site working locally

Развертывание в IIS

  1. Щелкните правой кнопкой мыши по проекту TestWebApp1 и выберите Опубликовать.
  2. Для простоты выберите «Файловая система» в качестве «метода публикации».
  3. Укажите путь, по которому будут развернуты файлы.
  4. На вашем веб-сервере откройте IIS (я предполагаю, что вы используете IIS 6.0)
  5. Под Веб-сайтом по умолчанию (или любым другим используемым вами сайтом) создайте новый Виртуальный каталог . Убедитесь, что у него есть права на запуск скриптов.
  6. Скопируйте файлы, которые были опубликованы на вашем компьютере разработчика, в виртуальный каталог IIS.
  7. Вот и все - ваш сайт должен работать нормально.

Basic VS 2010 Publish Dialog Virtual directory Access Permissions

После выполнения вышеуказанных действий у вас все еще возникают проблемы?

2 голосов
/ 14 марта 2011

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

Убедитесь, что папка bin находится в root веб-сайта в IIS.

У меня было www.mysite.com/myapp/bin, и это не сработало, мне нужно было dll в www.mysite.com/bin, даже если все мои страницы были внутри www.mysite.com/myapp (В моем случае Wordpress работал в корне с PHP и ASP.NET вещи в подпапке для определенных страниц)

(что еще хуже для меня выглядело из-за того, что в корневом каталоге уже была папка bin из предыдущего развертывания, и я обновлял сайт и задавался вопросом, почему мои изменения в коде не вступили в силу)

* * 1013 EDIT: Выяснил, как не помещать папку bin в корень сайта. В IIS, если щелкнуть правой кнопкой мыши папку приложения на веб-сайте, есть опция «Преобразовать в приложение» (по крайней мере, в IIS 7.5 нет уверенности в более старых версиях). После этого эта папка сможет использовать свой собственный bin и web.config

EDIT2: инструкции для IIS 6 и 7: http://www.banmanpro.com/support2/appstartpoint.asp

1 голос
/ 19 марта 2011

Это кажется проблемой пространства имен, поскольку динамически скомпилированные классы сталкиваются с предварительно скомпилированными классами.Я предлагаю сделать следующее:

1) Выберите разумное пространство имен для вашего приложения.«Рисование» - это хорошо, но я предлагаю что-то более контекстное, например CompanyName.ProjectName.AppName

2) Установите это пространство имен в качестве значения по умолчанию для проекта (Свойства проекта> вкладка «Приложение»)

3) Измените пространство имен в каждом файле кода ( .cs) и соответствующие ссылки в файлах сценариев ( .aspx, * .ascx)

4) Убедитесь, что нет повторяющихся классов.(это должно быть отмечено компилятором)

5) Удалить все файлы из временной папки ASP.NET

6) Перекомпилировать проект

1 голос
/ 18 марта 2011

Я получаю ошибку времени выполнения на полурегулярной основе; очистка:

C: \ Documents and Settings \\ Локальные настройки \ Данные приложения \ Microsoft \ WebsiteCache C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Временные файлы ASP.NET

(очевидно, замените ваш), и запуск iisreset обычно делает работу за меня. Кроме того, попробуйте «очистить» решение, прежде чем перестраивать; иногда кажется, что имеет значение.

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

Боюсь, ничего особенного, но стоит надеяться, что работа будет выполнена!

1 голос
/ 15 марта 2011

Я думаю, что IIS считает, что ваш проект является «сайтом ASP.NET», тогда как вы и / или ваш VS.NET можете подумать, что у вас действительно есть «ASP.NET Web Application».Нажав кнопку конвертировать в веб-приложение для проекта в VS.NET и убедившись, что у вас есть правильно настроенный (см. Другие комментарии) виртуальный каталог проекта в IIS, все должно работать нормально.противоречивые комментарии (если я не читаю)

Вы говорите:

  1. «Работа с шаблоном« ASP.NET Web Application »(против сайта ASP.NET)».
  2. "Я надеюсь, что это не единственное решение, потому что я не могу сделать это (клиент требует, чтобы мое приложение находилось в подкаталоге - они не разрешат любой мой код в ~ или ~ / bin.) "

" Веб-приложение ASP.NET "требует при развертывании скомпилированные dll, а не базовые файлы .cs.

Является ли коренная причина концептуальной путаницы между тем, что вы хотите использовать в качестве разработчика, и тем, что вам разрешено развертывать заказчиком?

1 голос
/ 02 февраля 2011

Я подозреваю, что объявление вашей страницы (<%@ Page ... %>) в файле apsx неверно.Посмотрите на атрибуты ClassName и CodeBehind и убедитесь, что они соответствуют вашему файлу .cs.

0 голосов
/ 18 марта 2011

Удалите следующую директиву страницы из представления HTML, создайте веб-сайт и попробуйте загрузить страницу в браузере.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Drawings2.WebForm1" %>
0 голосов
/ 18 марта 2011

Я думаю, что мог столкнуться с чем-то подобным раньше. Оказалось, что это потому, что у меня был default.aspx и default.master, которые оба автоматически компилируются с именем класса _default, поэтому получение типа существует в двух ошибках dll.

...