Поэтому у меня есть некоторые проблемы. Цель проблемы заключается в том, что когда я пытаюсь вызвать веб-службу из пользовательского контроля с помощью 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. Имя параметра: имя_метода

Любое решение?

0
Alexander Gharibashvili 13 Дек 2011 в 21:32

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 из заголовков, отправленных обратно с сервера.

2
Dave Ward 13 Дек 2011 в 22:05
Была проблема на стороне клиента, которую я пропустил изначально. Обновил мой ответ.
 – 
Dave Ward
13 Дек 2011 в 22:05
Также обновлен клиентский скрипт, но ничего нового, работает ли этот код на вашем компьютере? есть ли какие-то проблемы с конфигурациями? если этот код работает на вашем компьютере, поделитесь файлом web.config...
 – 
Alexander Gharibashvili
13 Дек 2011 в 22:11
Требования к конфигурации зависят от используемой версии ASP.NET. Взгляните на это: encosia.com/…
 – 
Dave Ward
13 Дек 2011 в 22:14
Этот проект работает на .net 2.0. мой файл web.config также похож на ваш образец. Есть ли какая-то проблема с IIS?
 – 
Alexander Gharibashvili
13 Дек 2011 в 22:38
Вам нужно будет установить расширения ASP.NET Ajax на сервер, чтобы заставить его работать с ASP.NET 2.0 (как упоминалось в сообщении, на которое я ссылался в своем последнем комментарии; делайте то, что он говорит, и это должно работать).
 – 
Dave Ward
13 Дек 2011 в 23:12