【问题标题】:jQuery AJAX post receives 405 error (HTTP verb POST not allowed)jQuery AJAX 发布收到 405 错误(HTTP 动词 POST 不允许)
【发布时间】:2012-06-30 12:47:15
【问题描述】:

我在 ASP.NET 网络方法中发布了以下 jQuery 帖子:

$.ajax({
    type: "POST",
    url: "AjaxWebMethods.aspx/UpdNote",
    contentType: "application/json; charset=utf-8",
    data: "{'ID' : '" + id + "', 'note' : '" + note + "' }",
    dataType: "json",
    success: UpdNote_Success,
    error: AjaxError
});

并且声明了web方法:

[System.Web.Services.WebMethod(enableSession: true)]
public static int UpdNote(int ID, string note) {
    // business logic that eventually returns a number, but simplifying
    // ... for the sake of brevity
    int retNum = 99;

    return retNum;
}

jQuery post 和 web 方法都在 Windows Authenticated 环境中工作得很好(即 ​​- 用户通过 LDAP 进行身份验证)。但是,我最近不得不将网站移动到使用 RSA(双重身份验证、pin 和令牌代码)对用户进行身份验证的服务器上,以便访问该网站。我现在看到的是我所有的 jQuery 帖子都返回“405 错误”。

很明显,跨站点请求浮现在脑海中,但这里没有发生。所有 jQuery AJAX 帖子都使用在 AjaxWebMethods.aspx 中声明的 Web 方法,该页面位于站点自己的域中。

提前感谢您的任何帮助或建议!

编辑:

在 IE8 中使用 Fiddler 为我提供了更多信息。它返回的错误代码仍然是 405,但服务器错误更具描述性。服务器错误是“不允许使用HTTP谓词POST访问路径'/AjaxWebMethods.aspx/UpdNote'。”

我确实尝试将 ajax 请求的类型参数更改为 GET,但我得到的是 404(找不到资源)。

另外,忘了提到这是通过 SSL 的(虽然我不认为这会有所作为)。

编辑:

经过广泛的测试(以及来自 stackoverflow 的精明成员的广泛帮助),我确定 405 错误与网站正在使用的应用程序池直接相关,更具体地说,与为应用程序池。

如果我使用面向 v4.0(.NET 框架)和集成(托管管道模式)的应用程序池,那么我的 AJAX 帖子就可以正常工作。但是,如果我使用面向 v4.0 和 Classic(托管管道模式)的应用程序池,则会收到 405 错误。

所以在这一点上,我仍在寻找这个问题的解决方案,尽管我已经能够解决这个问题。

【问题讨论】:

  • 为什么需要contentType 声明?您将 datatType 设置为 JSON 并且 “数据将始终使用 UTF-8 字符集传输到服务器;您必须在服务器端适当地对其进行解码。” 所以这部分也是不必要的- jQuery API
  • 你为什么不使用完整的网址? (除非您出于安全目的将其删除)

标签: jquery asp.net ajax rsa


【解决方案1】:

基于此:

jQuery post 和 web 方法都在 Windows Authenticated 环境中工作得很好(即 ​​- 用户通过 LDAP 进行身份验证)。但是,我最近不得不将网站移动到使用 RSA(双重身份验证、pin 和令牌代码)对用户进行身份验证的服务器上,以便访问该网站。我现在看到的是我所有的 jQuery 帖子都返回“405 错误”。

很明显该错误与服务器配置有关,但为了完全确定,如果可以,请在 RSA 服务器中创建一个新站点并为此站点禁用 RSA 身份验证,请尝试浏览您的站点只是为了绝对确定错误仅与 RSA 身份验证有关,丢弃新服务器中缺少的与代码相关的组件/配置

一旦您放弃了与代码相关的配置问题,我建议您仔细检查您的 RSA 配置(这可能很棘手)。曾经我在一个项目中使用 RSA 安全性来实现跨服务器的 SSO。 (单点登录),我记得有一个 RSA ISAPI 过滤器安装在服务器级别,这个过滤器负责读取/设置身份验证 cookie,以便针对 Active Directory 服务器对每个请求进行身份验证.

由于每个请求都由此过滤器管理,并且此 ISAPI 过滤器位于管道的顶部,因此每个请求都必须首先由 RSA ISAPI 过滤器处理才能进行身份验证

所以我的建议是仔细检查 RSA 配置,以检测是否有东西阻止了您的 AJAX 帖子

我记得 RSA 配置就像一个黑魔法盒,我们没有足够的文档,配置它是一个 PITA。我真诚地希望您的组织不是这种情况

【讨论】:

  • 谢谢朱保尔!你给了我一些有用的指示。我会试一试,看看我能挖出什么。我没有在这个服务器上设置 RSA,所以很遗憾,我在那个领域缺乏知识。但听起来我必须投入其中,弄脏它的 RSA 部分。
  • 我很高兴它有帮助。只有一件事,在挖掘 RSA 配置之前,确保部署到新服务器的站点实际上在该服务器中工作,为此,在该服务器中创建一个站点并更改 Windows 身份验证的 RSA 身份验证,或者只允许匿名用户并确保您的 AJAX 调用正常工作。如果他们这样做了,那么问题肯定与 RSA 配置(ISAPI 过滤器)有关
  • 好的,我在同一台服务器上设置了一个新网站,并验证了没有 RSA 的情况下它确实可以工作。没有 RSA 和 SSL,只使用 Windows 身份验证,它确实有效。又近了一步……我想。
  • Https 似乎也不是一个因素。只需将网站切换为使用 SSL,它就可以正常工作。
  • 所以你已经解决了你的问题,但现在你想知道背后的原因是不是这样? (与两个不同的应用池有关)
【解决方案2】:

405 HTTP 代码是“不允许的方法”代码。因此,您的新架构中有一些不正确的设置。这肯定是服务器配置错误。此错误可能源于许多地方,如果无法访问您的服务器,其他人将很难告诉您发生了什么。但也许我可以给你一些起点......

您是否仔细检查了您的web.config?这将是此类错误的常见来源。

您检查过您的 IIS 日志吗?这也是一个很好的起点。

如果您尝试 POST 而不设置请求的 contentType 会发生什么?可能您的页面未设置为接收 JSON 请求。

您是否尝试过使用Fiddler?尝试从外部客户端发送 POST 请求。

更新

还有一些建议:

您是否尝试过禁用 SSL?我将禁用它只是为了确保问题与 SSL 无关。

您是否在进行任何 URL 重写?如果是这样,这肯定是相关的。

您能否成功发布到任何 URL?也许 IIS 完全禁用了 POST。如果是这样,here is an article 可以帮助您启用它,here is a thread 也可能有帮助。

您是否尝试将 HttpPost 添加到您的 web.config 中?像这样的:

<webServices>
   <protocols>
      <add name="HttpPost" />
   </protocols>
</webServices>

【讨论】:

  • 这可能是 IIS 或 RSA 的错误配置,但通过在 stackoverflow 上发布,我希望运行类似场景(RSA + jQuery AJAX 帖子)的人可以告诉我它为他们工作,也许可以为我指明一些有用的方向。
  • 关于您的其他建议 - 1) 我不确定我会在 web.config 中寻找什么,甚至会对此产生影响。正如我在原始问题中所说,它在没有 RSA 身份验证的情况下工作,但在 RSA 到位时不起作用。这不会让我相信它与 web.config 有任何关系,除非必须设置一些我不知道的晦涩标签。
  • a) 没有检查 IIS 日志,所以我会试一试。 b) 页面设置为与 json 一起使用,并且在 RSA 到位之前这样做就很好。 c) 是的,我尝试了 Fiddler,但没有附带任何东西。从所有外观来看,当我运行 Fiddler 时,它甚至不像是向服务器发送 AJAX 帖子。
  • 在我的问题中查看我的最新编辑。我在 IE 8 中使用 Fiddler 挖掘了更多信息。
【解决方案3】:

出于故障排除目的,请尝试将 AJAX“POST”更改为 AJAX“GET”。将具有 ajax post 方法的页面从我们的开发环境移动到生产环境后,我遇到了稍微类似的问题。

【讨论】:

  • 感谢您的建议。我确实已经尝试过了,但没有任何运气。
【解决方案4】:

HTTP 405 是服务器错误,不是代码错误,表示资源(URL)被错误的方法访问。尝试使用 GET 而不是 POST。

【讨论】:

    【解决方案5】:

    也许您的服务器没有安装 ajax 扩展。尝试标记对CopyLoacal = true 的引用并将bin 文件夹部署到网络服务器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 2012-10-26
      • 2014-06-22
      • 2017-10-16
      • 2019-05-31
      • 1970-01-01
      相关资源
      最近更新 更多