#jquery #asp.net #web-services
#jquery #asp.net #веб-сервисы
Вопрос:
Я пытаюсь получить доступ к веб-сервису из jQuery. Это работает нормально.Я смог сохранить данные в базе данных. Пока я пытаюсь получить данные из базы данных, я не вижу результата. При отладке я вижу, что элемент управления нажимает GetFileInfo(), но обратный вызов в jQuery не работает. Я попробовал ошибку bebugging в fire bug, я ничего не вижу в ответе в firebug. Что я делаю не так.
MyService.asmx:
[WebMethod]
public FileInfo[] GetFileInfo(int Id)
{
Proxies.ServiceRef.ServiceClient c = new Proxies.ServiceRef.ServiceClient();
return c.GetFileInfo(Id).ToArray();
}
реализация jquery на странице .aspx.
this.ServiceProxy = function (serviceUrl) {
var _I = this;
this.serviceUrl = serviceUrl;
this.isWcf = false;
this.timeout = 10000;
this.contentType = "application/json";
this.invoke = function (method, params, callback, errorHandler) {
var jsonData = _I.isWcf ? JSON.stringifyWcf(params) : JSON.stringify(params);
// Service endpoint URL
var url = _I.serviceUrl method;
$.ajax({
url: url,
data: jsonData,
type: "POST",
contentType: _I.contentType,
timeout: _I.timeout,
dataType: "serviceproxy", // custom type to avoid double parse
dataFilter: function (jsonString, type) {
if (type == "serviceproxy") {
// Use json library so we can fix up dates
var res = JSON.parseWithDate(jsonString);
if (res amp;amp; res.hasOwnProperty("d"))
res = res.d;
return res;
}
return jsonString;
},
success: function (result) {
if (callback)
callback(result);
},
error: function (xhr, status) {
var err = null;
if (xhr.readyState == 4) {
var res = xhr.responseText;
if (res amp;amp; res.charAt(0) == '{' amp;amp; status != "parsererror")
var err = JSON.parse(res);
if (!err) {
if (xhr.status amp;amp; xhr.status != 200)
err = new CallbackException(xhr.status " " xhr.statusText);
else {
if (status == "parsererror")
status = "Unable to parse JSON response.";
else if (status == "timeout")
status = "Request timed out.";
else if (status == "error")
status = "Unknown error";
err = new CallbackException("Callback Error: " status);
}
err.detail = res;
}
}
if (!err)
err = new CallbackException("Callback Error: " status);
if (errorHandler)
errorHandler(err, _I, xhr);
}
});
}
}
var serviceUrl = "service/MyService.asmx/";
var proxy = new ServiceProxy(serviceUrl);
function GetFileInfo() {
proxy.invoke("GetFileInfo",
{ Id: $("#IAssignmentId").val() },
function (result) {
$.each(result, function (index) {
alert (this.Filename);
});
}, onPageError);
Обновление 1 :
Ответ в формате Json.
{"d":[{"__type":"Proxies.AFARServiceRef.AssignmentInfo","ExtensionData":{},"AssignDate":"/Date(1317748587667)/","AssignFileName":null,"ClaimId":"PA026195","ClaimantName":"Rachel Weiss","FirstContactDate":"/Date(1302678000000)/","FirstContactTime":{"Ticks":433800000000,"Days":0,"Hours":12,"Milliseconds":0,"Minutes":3,"Seconds":0,"TotalDays":0.50208333333333333,"TotalHours":12.049999999999999,"TotalMilliseconds":43380000,"TotalMinutes":723,"TotalSeconds":43380},"Id":5257,"InspectionDate":"/Date(1302246000000)/","StatusId":1,"SubmittedCount":5,"UploadedCount":9}]}
Ответ №1:
Похоже, что вы, вероятно, используете ASP.NET веб-сервис (asmx). Предполагая, что вы получаете правильный JSON из веб-сервиса (вы должны иметь возможность проверить это из firebug, просматривая ответ), я считаю, что проблема связана с вашей функцией обратного вызова success (попробуйте установить в нее точку останова). В службах asmx фактический результат переносится как свойство в результирующий объект JSON (чтобы избежать XSS), поэтому ваша функция успеха должна быть чем-то вроде
success: function (result) {
if (result) {
// unwrap result
result = result.d != undefined ? result.d : resu<
}
if (callback)
callback(result);
},
Вышесказанное будет работать как для служб asmx, так и для WCF.
Комментарии:
1. Большое спасибо. Когда я отлаживаю с помощью firebug, я вижу ответ, и статус 200 ok. Я установил точку останова при успешном выполнении. Но как только я нажимаю F10, как только элемент управления достигает успеха:, элемент управления переходит к ошибке :. Я прикрепил ответ Json к вопросу.
2. @BumbleBee, установка точки останова в
success:
будет достигнута при вызове веб-сервиса. Вам нужно установить точку останова в функции успеха или обратного вызова — скажем, в строке$.each(result, function (index) {
. В соответствующем примечании ваш ответ JSON не имеетFileName
свойства, поэтому строкаalert (this.Filename);
вызовет проблему. Измените это наalert(this.AssignFileName);
но имейте в виду, что ваш пример ответа имеет то же значение null.3. Установил точку останова, как упоминалось, но никогда не достигает точки останова. Я не знаю, как это сделать.
Ответ №2:
Это класс FileInfo из системы.Пространство имен ввода-вывода или пользовательский класс с тем же именем?
Если это так, то, скорее всего, веб-сервис выдает исключение при попытке сериализовать массив, поскольку класс FileInfo не может быть сериализован, поскольку у него нет конструктора без параметров.
Комментарии:
1. Спасибо. когда я выполняю отладку в firebug, я вижу, что при успешном выполнении выдается ошибка: функция (результат) {}. Я не могу понять, в чем ошибка. Когда я попытался перейти, это не привело к ошибке.