我一直在努力让我的 jquery 调用 webmethod 工作。我被服务器退回并显示“401 未经授权”响应。我必须在 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

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

有帮助吗?

解决方案

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

其他提示

来自 Firebug 控制台的 json 响应提供了最有说服力的线索(IMO)。System.InvalidOperationException(奇怪的是,它依赖于 401 响应)表明还有其他原因在起作用。

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top