jQuery AJAX帖子收到405错误(不允许HTTP动词POST)

时间:2012-06-28 23:06:36

标签: jquery asp.net ajax rsa

我将以下jQuery帖子发布到ASP.NET webmethod:

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

显然,很明显会出现跨站点请求,但这些都不会发生在这里。所有jQuery AJAX帖子都使用在AjaxWebMethods.aspx中声明的Web方法,该页面驻留在站点自己的域中。

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

修改

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

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

另外,忘记提及这是通过SSL(虽然我不认为这会产生影响)。

修改

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

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

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

5 个答案:

答案 0 :(得分:3)

基于此:

  

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

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

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

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

所以我的建议是仔细检查RSA配置,以便检测是否存在阻止您的AJAX帖子的内容

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

答案 1 :(得分:1)

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

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

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

如果您在未设置请求的contentType的情况下尝试POST,会发生什么?也许你的页面没有设置为接收JSON请求。

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

<强>更新

还有一些建议:

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

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

您可以成功发布到任何网址吗?也许IIS完全禁用了POST。如果是,here is an article可以帮助您启用它,here is a thread也可以帮助您。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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