我有以下 jQuery 调用 WCF 方法的部分。该方法调用成功,我可以看到它正在记录,并且它确实返回布尔值true。但是,错误处理程序返回“AJAX 调用在 CallIsDataReady 中失败”和“语法错误:无效字符”。然后它不会采取成功路径调用callUpdateGrid。我找不到无效字符。救命!
function CallIsDataReady(input) {
$.ajax({
url: "http://www.blah.com/services/TestsService.svc/IsDataReady",
type: "GET",
contentType: "application/json; charset=utf-8",
data: input,
dataType: "json",
success: function (data) {
if (!data) {
setTimeout(function (inputInner) { CallIsDataReady(inputInner); }, 1000);
}
else {
console.log("data returned - calling callUpDateGrid");
//Continue as data is ready
callUpdateGrid(input);
}
},
error: function (jqXHR, textStatus, errThrown) {
console.log("AJAX call failed in CallIsDataReady");
console.log(errThrown);
}
});
}
$(document).ready(function () {
var input = { "requestGUID": "<%=guid %>" };
CallIsDataReady(input);
});
服务器端方法返回 JSON,因为它是启用 AJAX 的 Web 服务:
[OperationContract]
[WebGet]
public bool IsDataReady(string requestGUID)
{
bool isReady = Global.publicDataDictionary.Keys.Contains(requestGUID);
using (savitasEntities2 db = new savitasEntities2())
{
DataRequestLog drl = new DataRequestLog();
drl.registrationID = "";
drl.request = "Is Ready=" + isReady;
drl.connectionID = "";
drl.created = System.DateTime.Now.ToUniversalTime();
drl.direction = "tickler";
drl.dataRequestGUID = requestGUID;
db.DataRequestLogs.Add(drl);
db.SaveChanges();
}
return isReady;
}
编辑:第二个 JavaScript 方法是:
function callUpdateGrid(input) {
console.log(input);
$.ajax({
url: "http://www.blah.com/services/TestsService.svc/GetContactsDataAndCountbyGUID",
type: "GET",
contentType: "application/json; charset=utf-8",
data: input,
dataType: "json",
success: function (data) {
var mtv = $find("<%= RadGrid1.ClientID %>").get_masterTableView();
console.log(data);
mtv.set_dataSource(data.d.Data);
mtv.dataBind();
},
error: function (jqXHR, textStatus, errThrown) {
console.log("AJAX call failed in callUpdateGrid");
console.log(errThrown);
}
});
}
虽然您的代码已经可以运行,但您仍然应该考虑这些事情。我不是 JavaScript 专家,但我相信您调用方法的方式是不正确的。首先,您的
OperationContract
是 WebGet
,因此您不需要在请求中提供 Content-Type
。当您使用 POST方法发送大量数据时,通常会使用
Content-Type
。因此,根据我的说法,更改以下内容:
[OperationContract]
[WebGet(UriTemplate = "/GUID={requestGUID}", ResponseFormat = WebMessageFormat.Json)]
public bool IsDataReady(string requestGUID)
{
bool isReady = Global.publicDataDictionary.Keys.Contains(requestGUID);
using (savitasEntities2 db = new savitasEntities2())
{
DataRequestLog drl = new DataRequestLog();
drl.registrationID = "";
drl.request = "Is Ready=" + isReady;
drl.connectionID = "";
drl.created = System.DateTime.Now.ToUniversalTime();
drl.direction = "tickler";
drl.dataRequestGUID = requestGUID;
db.DataRequestLogs.Add(drl);
db.SaveChanges();
}
return isReady;
}
我希望这一定会成功。现在此方法将以 JSON 格式返回
isReady
。如果您没有在 ResponseFormat
中指定 OperationContract
,那么默认情况下它将返回到 XML
。
现在尝试删除
Content-Type: application/json; charset=utf-8
,因为您没有以 JSON 发送数据并执行您的方法。响应将采用 JSON 格式,因此,您必须解析它才能获取 isReady
值。
使用此 URL 调用服务:
url: "http://www.blah.com/services/TestsService.svc/GUID=abc123"
这很简单且易于实现。感谢您的耐心等待。
编辑: 在您的
BodyStyle = WebMessageBodyStyle.Bare
中添加 OperatcionContract
。