8

我一直在努力让我的 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

我期待您的见解和方向-谢谢!

4

3 回答 3

6

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

于 2010-02-22T08:18:17.247 回答
2

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

首先,在“InvalidOperationException webmethod jquery”上进行谷歌搜索会返回表明序列化问题可能引发此异常的文章。为了排除这种情况,暂时将“data:paramList”更改为“data:'{}'”。此外,附加一个调试器并查看异常是在方法执行之前还是在它完成并尝试序列化结果之后发生。

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

于 2010-02-19T18:37:09.763 回答
0

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

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

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

于 2010-02-19T17:42:02.410 回答