使用jquery调用webmethod时始终获得“401 Unauthorized”错误

时间:2010-02-19 16:27:51

标签: asp.net jquery authentication http-status-code-401 webmethod

我一直在努力让我的jquery调用webmethod来工作。我被服务器以“401 Unauthorized”响应退回。我必须在web.config或其他阻止呼叫成功的地方设置不正确。

非常感谢您的见解!

调用js函数调用jquery调用

button.OnClickAction = "PageMethod('TestWithParams', ['a', 'value', 'b', 2], 'AjaxSucceeded', 'AjaxFailed'); return false;";

进行jquery调用的JavaScript函数

function PageMethod(fn, paramArray, successFn, errorFn) {
var pagePath = window.location.pathname;
var urlPath = pagePath + "/" + fn;

//Create list of parameters in the form:  
//{"paramName1":"paramValue1","paramName2":"paramValue2"}  
var paramList = '';
if (paramArray.length > 0) {
    for (var i = 0; i < paramArray.length; i += 2) {
        if (paramList.length > 0) paramList += ',';
        paramList += '"' + paramArray[i] + '":"' + paramArray[i + 1] + '"';
    }
}
paramList = '{' + paramList + '}';

//Call the page method
$.ajax({
    type: "POST",
    url: pagePath + "/" + fn,
    contentType: "application/json; charset=utf-8",
    data: paramList,
    timeout: 10000,
    dataType: "json",
    success: function(result) { alert('Overjoyed'); },
    error: function(result) { alert('No joy'); }
});
}

页中的Web方法
    public partial class WebLayout : System.Web.UI.Page
{

    [WebMethod()]
    public static int TestNoParams()
    {
        return 1;
    }

    [WebMethod()]
    public static string TestWithParams(string a, int b)
    {
        return a + b.ToString();
    }
...

在Firebug控制台中看到的响应

json: {"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}

"NetworkError: 401 Unauthorized - http://localhost/Care-Provider-Home/Profile/Personal-Profile.aspx/TestWithParams" TestWithParams

我已经查看并阅读了有关该主题的常用网站(Encosia等),但是有用。要么我错过了一个关键部分,要么我的环境的安全参数中有一些微妙的因素阻止了呼叫。

以下是一些可能影响您诊断的其他可能有用的花絮:

  • 代码隐藏中的Web方法
  • 使用Sitecore CMS(似乎没有干涉,永远不知道)
  • IIS7
  • .NET 3.5
  • jQuery 1.3.2

我期待您的见解和指导 - 谢谢!

3 个答案:

答案 0 :(得分:6)

是的,确实有效!由于Sitecore CMS确实执行URL重写以生成友好的URL(它以层的形式组装页面,动态地,类似于Master Page概念),因此我发现它可能导致一些问题,最初导致401错误。我通过使用单个ASPX创建一个单独的项目来验证这一点 - 通过一些工作,我可以调用Web方法并使用jquery获取值。然后我在我的Web根目录中创建了几乎相同的ASPX,但是在发出请求时告诉Sitecore忽略它(web.config中的IgnoreUrlPrefixes),经过一些工作我也能让它成功运行!谢谢你的帮助。

答案 1 :(得分:2)

来自Firebug控制台的json响应提供了最有说服力的线索IMO。 System.InvalidOperationException(奇怪地依赖于401响应)表明更多的东西正在起作用。

首先,在Google上搜索“InvalidOperationException webmethod jquery”会返回一些文章,这些文章表明序列化问题会引发此异常。要对此进行排除,请暂时将“data:paramList”更改为“data:'{}'”。此外,附加调试器并在方法执行之前或完成之后查看异常是否发生并尝试序列化结果。

如果上述步骤为空,您可能需要尝试重置为干净的web.config或阅读“InvalidOperationException webmethod”搜索中返回的更多结果

答案 2 :(得分:0)

您使用何种形式的身份验证?首先想到的是确保IIS中的webApp设置为允许匿名用户(如果您确实希望以匿名用户的身份进行呼叫)。此外,web.config中的身份验证模式未被错误地设置为Windows。如果您不允许匿名用户并且正在使用表单身份验证,则在从您的页面进行此调用之前,用户必须先登录。

如果正确设置了上述内容,则尝试从服务器端定期调用服务,以确保问题是一致的,无论服务调用点如何。

如果问题未解决,请发布更多设置。希望这会有所帮助。