ASP.NET MVC POST неправильно возвращает HTTP 302

Я просмотрел все и не могу найти ответ на этот вопрос. У меня есть простой тестовый контроллер в ASP.NET MVC4, настроенный следующим образом:

public class TestController {
    [HttpGet]
    public ActionResult Index() {
        MyModel model = new MyModel();
        model.Debug += "GET Method";
        return View(model);
    }

    [HttpPost]
    public ActionResult Post(MyModel model) {
        model.Debug += "POST Method";
        return View("Index", model);
    }
}

В представлении Index просто есть форма и кнопка, которые отправляются в /Test/Post, которые должны просто возвращать HTTP 200 с представлением Index. Это работает как на моем ноутбуке, так и на моем сервере. Но на хостинг-провайдере я получаю следующее, когда я выполняю POST:

POST /Test/Post returns HTTP 302 Redirect to /Test/Post (What the heck?)
GET /Test/Post returns HTTP 404

Как это могло случиться? Любые идеи по устранению этой проблемы?

Единственное различие, которое я знаю между средами, заключается в том, что у меня установлен .NET 4.5, и у них установлен .NET 4.0 (и по какой-то причине не будет устанавливать 4.5.) Проекты нацелены на .NET 4, хотя, Думаю, это будет иметь значение? Первоначально у меня они были нацелены на 4,5, но изменили его после того, как я узнал, что он не установлен на сервере.

Поиск POST-запросов ASP.NET, возвращающих 302, вызывает много вопросов о перенаправлении из-за входа в систему. Но этот контроллер не находится под какой-либо ограниченной папкой или атрибутом [Authorize].


Обновление - web.config

Я пробовал это с и без <authorization>, одинаковые результаты в любом случае. Вот система system.web, если это поможет:

  <system.web>
    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </assemblies>
    </compilation>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="30"/>
    </authentication>
    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="Database" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/"/>
      </providers>
    </membership>
    <pages controlRenderingCompatibilityVersion="4.0">
      <namespaces>
        <add namespace="System.Web.Helpers"/>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
        <add namespace="System.Web.WebPages"/>
        <add namespace="Microsoft.Web.Mvc"/>
        <add namespace="Tenido.Domain"/>
        <add namespace="Tenido.Web.Mvc.Controllers"/>
      </namespaces>
    </pages>
    <httpModules>
      <add name="ImageResizingModule" type="ImageResizer.InterceptModule"/>
    </httpModules>
  </system.web>

Ответ 1

После многого назад хостинг-провайдер привлек мое внимание, что они не поддерживают ASP.NET MVC 4, только до 3. Я не уверен, как и почему они не поддерживают новую версию, но это, кажется, корень проблемы.

Излишне говорить, что я перешел на хост, поддерживающий последние рамки. Теперь сайт работает отлично.

Ответ 2

Использовать атрибут AllowAnonymous в вашем контроллере. Метод

[AllowAnonymous]
[HttpGet]
public ActionResult Index() {
    MyModel model = new MyModel();
    model.Debug += "GET Method";
    return View(model);
}

Надеюсь, что это поможет

Ответ 3

У меня была проблема с similiar.

Что помогло мне удалить тег <authorization> из web.config.

Нет необходимости в атрибутах [Authorize] и сменил код от 302 до 404.

Ответ 4

У меня была аналогичная проблема. После удаления тега авторизации из web.config это сработало для меня. Не уверен в причине.

Ответ 5

Для меня у нас была перенаправлена ​​ошибка, настроенная для пользовательских ошибок через web.config

<system.web> 
...  

 <customErrors mode="On" defaultRedirect="~/error/errorpage">
...

</customErrors>

Он сделал 302 после внутренней ошибки. Установка режима customErrors = "Выкл." Всплыла ошибка до браузера.

Ответ 6

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

Ответ 7

Если используется проверка подлинности на основе .AspNet.ApplicationCookie cookie, убедитесь, что файл cookie, возвращаемый для .AspNet.ApplicationCookie (или как его там), соответствует домену сайта, на котором вы находитесь.

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