【发布时间】: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 -
你为什么不使用完整的网址? (除非您出于安全目的将其删除)