我有一个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服务时检查谷歌浏览器中的“控制台”,它说的是:
“支持以下操作...”,它显示了我的一个'IsLoggedIn'方法,但在此控制台窗口中呈现的所有内容本质上都是一个HTML页面,带有HTML标记。
我似乎永远不会a)打破代码中的断点或b)获得回复我的javascript的响应(因此我的代码中没有显示的js警报正在发生)。
答案 0 :(得分:3)
它正在获得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
答案 1 :(得分: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
,其中包含你的方法返回的属性。
如果是bool,它将如下所示:
Object
d: true
所以在response.d
中你可以继续你的布尔。