【问题标题】:Calling a Web Service using jQuery to return a simple Boolean value使用 jQuery 调用 Web 服务以返回一个简单的布尔值
【发布时间】:2012-03-16 09:24:50
【问题描述】:

我有一个 ASP.NET Web 窗体应用程序,在我的一个 .ASPX 页面上我有一些 javascript。

在 Javascript 的一部分中,我想调用 Web 服务,以便我可以执行服务器端函数并返回 true 或 false 值,然后在 javascript 中我可以根据 true 执行两个操作之一或假值。

我之前没有做过任何网络服务,所以我很难将一个简单的值返回给 JS。

我的 WebService (LoginCheck.asmx) 目前看起来像这样:

[System.Web.Script.Services.ScriptService]
public class LoginCheck : System.Web.Services.WebService
{
    [WebMethod]
    public bool IsLoggedIn()
    {
        return UserService.IsAuthenticated();
    }
}

我的 Javascript 调用目前看起来像这样:

$.ajax({
    type: "GET",
    contentType: "application/json; charset=utf-8",
    url: "LoginCheck.asmx/IsLoggedIn",
    data: "{}",
    dataType: "json",
    success: function (response) {
        if (response) {
            alert('Logged in: true');
        } else {
            alert('Logged in: false');
        }
    }
});

尽管在“IsLoggedIn”Web 服务方法的代码中有一个断点,但它永远不会中断。当应该调用 Web 服务时,我已经检查了 Google Chrome 中的“控制台”,它显示的内容如下:

“支持以下操作...”,它显示了我的一个'IsLoggedIn'方法,但是在这个控制台窗口中呈现的所有内容本质上都是一个HTML页面,带有HTML标记。

我似乎从来没有 a) 在代码中的断点处中断或 b) 得到对我的 javascript 的响应(因此我上面的代码中显示的 js 警报都没有发生)。

【问题讨论】:

    标签: jquery asp.net ajax web-services asmx


    【解决方案1】:

    它得到一个 301 重定向回到 LoginCheck.asmx

    我今天遇到了同样的问题。

    您可能在 IIS 的 URLRewrite 2 模块中使用了 LowerCaseRule。 你的方法名是IsLoggedIn,所以LowerCaseRule尝试调用isloggedin,失败了。

    您的 LowerCaseRule 应该忽略 asmx 文件,如下所示:

            <rule name="LowerCaseRule1" stopProcessing="true">
                <match url="[A-Z]" ignoreCase="false" />
                <conditions>
                    <add input="{URL}" matchType="Pattern" pattern="^.+\.((axd)|(js)|(xaml)|(asmx))$" ignoreCase="true" negate="true"/>
                </conditions>
                <action type="Redirect" url="{ToLower:{URL}}" />
            </rule>
    

    编辑:我总结了今天的一些经验,贴在这里:http://www.tomot.de/en-us/article/8/asp.net/how-to-use-jquery-to-call-a-webservice-asmx-method

    【讨论】:

    • 这听起来可能是问题所在,因为我确实有小写规则。我会在两周后重新开始工作时尝试这个,并用结果更新这个问题。非常感谢您的帮助。
    • 完美 - LowerCaseRule 中的这个条件修复了问题,谢谢。
    • 非常感谢。你不知道我花了多少时间来解决这个问题
    • @Lars Holdgaard:我很高兴能提供帮助;)
    【解决方案2】:

    您必须发布您的请求并且不要发送空数据:

    $.ajax({
        type: "POST", // CHANGED
        contentType: "application/json; charset=utf-8",
        url: "LoginCheck.asmx/IsLoggedIn",
        //data: "{}", REMOVED
        //dataType: "json", REMOVED, NOT NEEDED
        success: function (response) {
            if (response.d) { // CHANGED
                alert('Logged in: true');
            } else {
                alert('Logged in: false');
            }
        }
    });
    

    然后你会得到一个对象response,其中包含你的方法返回的任何属性。

    如果它是布尔值,它将如下所示:

    Object
    d: true
    

    所以在response.d 中,您可以继续使用布尔值。

    【讨论】:

    • 删除这些行并将其更改为 post 现在似乎至少在调用 asmx 后进入 js 警报,但是 a) 我的断点没有在 asmx 中命中,并且在 js 中警告“response.d”给了我“未定义”,尽管方法返回类型是布尔值。有什么想法吗?
    • 另外,如果我在 js 中调用 alert(response),它似乎包含一个 html 文档(只是加载 html 标记),我认为它包含“支持以下操作...”,它具有 LoginCheck.asmx?disco 或类似于标记的 HEAD 部分中的内容。
    • 我把它放在我的语言环境机器上检查,它工作正常。你的请求一定有问题。如果显示“支持以下操作”,则表示函数调用错误。尝试在浏览器中直接打开 LoginCheck.asmx,它应该会列出可能的方法。然后选择您的操作并单击调用 - 并调试浏览器向您的服务发送的内容(以 chrome 中的开发工具为例)。
    • 哦,也许可以删除 contentType,但它对我来说很好用。
    • 使用 Fiddler,看起来当我单击调用按钮时,它会得到一个 301 重定向回 LoginCheck.asmx 页面(没有方法名称/附加到 url) - 每次。
    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多