Поэтому у меня есть некоторые проблемы. Цель проблемы заключается в том, что когда я пытаюсь вызвать веб-службу из пользовательского контроля с помощью Ajax, я получаю 500 Internal Server Error.
Вот мой пример кода:
Веб-сервис .CS
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class BudgetJson : System.Web.Services.WebService {
public BudgetJson ()
{
}
[WebMethod]
public static String GetRecordJson()
{
return " Hello Master, I'm Json Data ";
}
}
Файл управления пользователем (.Ascx) (вызов Ajax)
$(document).ready(function () {
$.ajax({
type: "POST",
url: "BudgetJson.asmx",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg)
{
alert(msg);
}
});
});
Итак, когда страница загружается и запрос отправляется, я получил такой ответ:
soap:ReceiverSystem.Web.Services.Protocols.SoapException: серверу не удалось обработать запрос. ---> System.Xml.XmlException: данные на корневом уровне недействительны. Строка 1, позиция 1. в System.Xml.XmlTextReaderImpl.Throw(Exception e) в System.Xml.XmlTextReaderImpl.Throw(String res, String arg) в System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() в System.Xml.XmlTextReaderImpl. ParseDocumentContent() в System.Xml.XmlTextReaderImpl.Read() в System.Xml.XmlTextReader.Read() в System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read() в System.Xml.XmlReader.MoveToContent() в System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.MoveToContent() в System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestElement() в System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest() в System.Web.Services. Protocols.SoapServerProtocol.RouteRequest(сообщение SoapServerMessage) в System.Web.Services.Protocols.SoapServerProtocol.Initialize() в System.Web.Services.Protocols.ServerProtocol.SetContext(тип типа, контекст HttpContext, HttpR запрос запроса, ответ HttpResponse) в System.Web.Services.Protocols.ServerProtocolFactory.Create(тип типа, контекст HttpContext, запрос HttpRequest, ответ HttpResponse, логическое значение и abortProcessing) --- Конец внутренней трассировки стека исключений ---
Если я добавлю имя метода в URL, я получаю такую ошибку:
Неизвестный веб-метод GetRecordJson. Имя параметра: methodName Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.ArgumentException: неизвестный веб-метод GetRecordJson. Имя параметра: имя_метода
Любое решение?
1 ответ
Пара вещей на стороне сервера:
Метод не должен быть статичным. Это относится только к «методам страницы» на страницах ASPX.
Во-вторых, вам нужно украсить класс службы атрибутом [ScriptService]
, чтобы иметь возможность общаться с ним в JSON, что, как я предполагаю, вы, вероятно, захотите сделать, поскольку используете jQuery.
[ScriptService]
public class BudgetJson : System.Web.Services.WebService {
[WebMethod]
public String GetRecordJson()
{
return " Hello Master, I'm Json Data ";
}
}
На стороне клиента вам нужно указать, какой метод вы хотите выполнить в URL-адресе $.ajax()
:
$.ajax({
type: "POST",
url: "BudgetJson.asmx/GetRecordJson",
data: "{}",
// The charset and dataType aren't necessary.
contentType: "application/json",
success: function (msg) {
alert(msg);
}
});
Вы также можете немного упростить использование $.ajax()
, как показано выше. Кодировка не требуется, и jQuery автоматически определяет dataType из заголовков, отправленных обратно с сервера.
Похожие вопросы
Новые вопросы
asp.net
ASP.NET - это среда разработки веб-приложений Microsoft, которая позволяет программистам создавать динамические веб-сайты, веб-приложения и веб-службы. Полезно использовать этот тег в сочетании с тегом типа проекта, например, [asp.net-mvc], [asp.net-webforms] или [asp.net-web-api]. НЕ используйте этот тег для вопросов о ASP.NET Core - используйте вместо этого [asp.net-core].