我将以下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错误。
所以在这一点上我仍然在寻找这个问题的解决方案,尽管我已经能够解决这个问题了。
答案 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服务器。