jQuery AJAXpost收到405错误(不允许HTTP动词POST)

我有一个ASP.NET webmethod的以下jQuerypost:

$.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; } 

jQuerypost和Web方法在Windows Authenticated环境中都很好用(即 – 用户通过LDAP进行身份validation)。 但是,我最近不得不将网站移动到使用RSA(双因素身份validation,引脚和令牌代码)的服务器,以便对用户进行身份validation以获取对该网站的访问权限。 而我现在看到的是我所有的jQuerypost都返回“405错误”。

很明显,我想到了跨站点请求,但这些都不会发生在这里。 所有jQuery AJAXpost都使用在AjaxWebMethods.aspx中声明的Web方法,该页面驻留在站点自己的域中。

在此先感谢您的任何帮助或建议!

编辑:

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

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

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

编辑:

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

如果我使用面向v4.0(.NET Framework)和集成(管理管道模式)的应用程序池,那么我的AJAXpost就可以了。 但是,如果我使用针对v4.0和Classic(管理流水线模式)的应用程序池,那么我会收到405错误。

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

基于此:

jQuerypost和Web方法在Windows Authenticated环境中都很好用(即 – 用户通过LDAP进行身份validation)。 但是,我最近不得不将网站移动到使用RSA(双因素身份validation,引脚和令牌代码)的服务器,以便对用户进行身份validation以获取对该网站的访问权限。 而我现在看到的是我所有的jQuerypost都返回“405错误”。

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

一旦您放弃了与代码相关的配置问题,我建议您仔细检查您的RSA配置(这可能很棘手)。 一旦我使用RSA安全性在项目中工作,就可以跨服务器实现SSO。 (单点登录),我记得在服务器级安装了一个RSA ISAPIfilter ,该filter负责读取/设置身份validationcookie,以便针对Active Directory服务器validation每个请求。

由于每个请求都由此filter管理,并且此ISAPIfilter位于管道的顶部,因此每个请求必须首先由RSA ISAPIfilter处理,以便进行身份validation

所以我的建议是仔细检查RSA配置,以便检测是否有阻止你的AJAXpost的东西

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

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

你仔细检查了你的web.config吗? 对于像这样的错误来说,这将是一个常见的地方。

你检查过你的IIS日志了吗? 这也是一个非常好的起点。

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

你尝试过使用Fiddler吗? 尝试从外部客户端发送POST请求。

更新

还有一些建议:

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

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

你能成功地发布到任何URL吗? 也许IIS完全禁用了POST。 如果是这样, 这篇文章可以帮助您启用它, 这里有一个可能有用的线程 。

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

      

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

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

也许你的服务器没有安装ajax扩展。 尝试标记对CopyLoacal = true的引用, CopyLoacal = true bin文件夹部署到Web服务器。