Приложение MVC возвращает 404 для действия контроллера только на сервере

#asp.net-mvc-3

#asp.net-mvc-3

Вопрос:

У меня есть контроллер с двумя действиями, каждое из которых возвращает ответ от индексного действия после установки заданного параметра.

 public ActionResult Index(int? pageType)
{
    // Do something based on the pageType
    return View();
}

public ActionResult Guides()
{
    return Index(1);
}

public ActionResult Discussions()
{
    return Index(2);
}
  

Причина, по которой я это делаю, заключается в том, чтобы сделать URL-адрес немного чище, не слишком вмешиваясь в маршрутизацию (установка маршрута для принятия типа страницы в качестве строкового параметра привела бы к путанице с отображением действий контроллера, а я хотел, чтобы URL-адрес отображал тип страницы)

Просто чтобы запутать ситуацию, я динамически проверяю соответствие представления на основе параметра PageType и использую это, в противном случае я придерживаюсь представления ‘Index’ по умолчанию. Я использую стандартное сопоставление маршрутов, чтобы перехватить это.

Как это часто бывает, все это прекрасно работает локально. Проблема возникает при доступе к URL на веб-сервере. Когда я перехожу к действию «Руководства», все работает нормально, однако переход к действию «Обсуждения» возвращает 404. Странно то, что доступ к одному и тому же URL в браузере на самом сервере работает нормально!

Оно работает на Windows Server 2008 R2 (IIS7) с пулом приложений, установленным на интегрированный. Это также MVC 3 на .Net 4.

Кто-нибудь видел что-нибудь подобное раньше или имеет какие-либо идеи, как диагностировать? Я не уверен, куда идти дальше…

Редактировать:

Хорошо, итак, для краткости я пропустил некоторые вещи, которые, по моему мнению, не имели значения, насколько я был неправ…

В дополнение к параметру PageType существует также необязательная категория. Это проверяет, существует ли категория в базе данных, и добавляет ее в модель представления.

В представлении есть вызов @Html.RenderAction, который отправляет идентификатор категории другому методу действия. Я не уверен, почему я сделал это таким образом, вместо того, чтобы просто вызвать @Html.Partial, передавая в модели, но привет. В любом случае, если категория не была найдена, этот метод action вернул результат HttpNotFound, следовательно, 404.

Я только что изменил «дочерний» метод действия, чтобы вернуть частичное представление, используя пустой объект в качестве модели (новый пустой список в моем случае), и это устранило проблему.

Потребовалось немного покопаться, но в конце концов я добился своего, в будущем я обязательно буду использовать RenderAction только тогда, когда мне действительно нужно выполнить дополнительную обработку действий, которая не может быть выполнена в начальном действии контроллера.

Конечно, это не помогает объяснить, почему это сработало при локальном доступе к серверу. Я предполагаю, что это должно быть как-то связано с результатом HttpNotFound.

Комментарии:

1. кажется, что тип страницы может быть значительным. Можете ли вы указать, что именно Index () делает с PageType?

Ответ №1:

Что произойдет, если вы измените вызов на Index from Discussions ? Если вы используете 1 вместо 2, имеет ли это значение?

 public ActionResult Discussions()
{
    return Index(1);
}
  

Комментарии:

1. Похоже, это ничего не меняет, я также попытался передать разные значения в действие Index… снова работает нормально, получая доступ на сервере, но не через Интернет

2. Итак, Guides — единственный, который работает через Интернет? Сбой индексации и обсуждения?

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

4. Я использую тот же URL-адрес для доступа к серверу, что и через Интернет.

5. Отсортировано. Вы никак не могли ответить на это информацией, которую я предоставил, чтобы извиниться за это. 1 за усилие, хотя…

Ответ №2:

Итак, просто для решения вопроса. В родительском представлении у меня был вызов @Html.RenderAction , который, в свою очередь, выполнил приведенный ниже код:

 public ActionResult SubCategories(string categoryName)
{
    Category category = CategoryRepository.GetCategory(categoryName);
    if (category == null)
        return HttpNotFound();

    return PartialView("Categories", category.SubCategories);
}
  

Это возвращало HttpNotFound() ActionResult, который, в свою очередь, привел к 404 для родительского представления.

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

 public ActionResult SubCategories(string categoryName)
{
    IList<Category> subCategories = new List<Category>();

    Category category = CategoryRepository.GetCategory(categoryName);
    if (category != null)
        subCategories = category.SubCategories;

    return PartialView("Categories", subCategories);
}