【问题标题】:ASP.NET MVC POST incorrectly returning HTTP 302ASP.NET MVC POST 错误地返回 HTTP 302
【发布时间】:2013-12-19 00:58:43
【问题描述】:

我已经翻遍了,找不到答案。我在 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 视图只有一个表单和一个 POST 到 /Test/Post 的按钮,它应该只返回带有 Index 视图的 HTTP 200。 这在我的笔记本电脑和服务器上按预期工作。但是在托管服务提供商上,当我执行 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,但在得知它未安装在服务器上后更改了它。

搜索返回 302 的 ASP.NET POST 会引发很多关于由于登录而重定向的问题。但此控制器不在任何类型的受限文件夹或[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>

【问题讨论】:

  • 您可以在托管服务提供商的服务器上启用任何跟踪吗?
  • 很遗憾,不,我无法启用跟踪。我确实提交了一份支持票,建议他们也这样做来帮助调试问题。那是 8 小时前的事了,希望很快能收到回复...
  • 提供程序设置上的框是否可能将 HTTP 重定向到 HTTPS?
  • 此托管计划不包括 HTTPS。
  • 你能分享一个提琴手的踪迹吗?

标签: c# asp.net-mvc-4 http-post http-status-code-302


【解决方案1】:

在控制器方法中使用 AllowAnonymous 属性

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

希望对你有帮助

【讨论】:

  • 感谢您的想法,但仍然产生相同的结果。
【解决方案2】:

我有类似的问题。

帮助我的是从 web.config 中删除 &lt;authorization&gt; 标签。

[Authorize]属性不需要,将302改为404代码。

【讨论】:

  • 尝试从 web.config 中删除 ,但仍然产生相同的结果。
【解决方案3】:

经过多次反复,托管服务提供商让我注意到他们不支持 ASP.NET MVC 4,只支持 3。我不确定他们如何或为什么不支持较新的版本,但这似乎是问题的根源。

不用说,我搬到了支持最新框架的主机。现在该网站运行良好。

【讨论】:

    【解决方案4】:

    我有类似的问题。从 web.config 中删除 Authorization 标签后,它对我有用。不知道是什么原因。

    【讨论】:

      【解决方案5】:

      对我来说,我们通过 web.config 为自定义错误配置了错误重定向

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

      发生内部错误后,它正在执行 302。设置 customErrors mode="Off" 会将错误一直冒泡到浏览器。

      【讨论】:

        【解决方案6】:

        如果使用基于 cookie 的身份验证,请确保为 .AspNet.ApplicationCookie(或任何名称)返回的 cookie 与您所在站点的域匹配

        有时发生在我身上的是 cookie 域对于我所在的站点不正确(由于我老化的、笨拙的多托管环境) - 然后尽管发出了新的身份验证 cookie,但浏览器无法将其发送回来在重定向期间(因为它是不同的域),因此它会重定向回身份验证页面。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-17
          • 1970-01-01
          • 2017-09-13
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          相关资源
          最近更新 更多