ASP.NET - вызов веб-службы из пользовательского элемента управления (.Ascx) возвращает ошибку 500 Внутренняя ошибка сервера

так что у меня проблема. Цель проблемы заключается в том, что когда я пытаюсь вызвать веб-службу из пользовательского элемента управления с помощью Ajax, у меня возникает внутренняя ошибка сервера 500.

Вот мой пример кода:

Веб-сервис .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);
                }
            });
        });

Итак, когда страница загружается и отправляется запрос, я получил такой ответ:

Мыло: ReceiverSystem.Web.Services.Protocols.SoapException: сервер не смог обработать запрос. --- ›System.Xml.XmlException: данные на корневом уровне недействительны. Строка 1, позиция 1. в System.Xml.XmlTextReaderImpl.Throw (исключение e) в System.Xml.XmlTextReaderImpl.Throw (String res, String arg) в System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace () в System.Xml.XmlText. ParseDocumentContent () в System.Xml.XmlTextReaderImpl.Read () в System.Xml.XmlTextReader.Read () в System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read () в System.Xml.XmlReader.MoveTotent () System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.MoveToContent () в System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestElement () в System.Web.Services.Protocols.Soap12ServerProtocolHelper.Route Protocols.SoapServerProtocol.RouteRequest (сообщение SoapServerMessage) в System.Web.Services.Protocols.SoapServerProtocol.Initialize () в System.Web.Services.Protocols.ServerProtocol.SetContext (тип типа, контекст HttpContext, HttpR запрос equest, ответ HttpResponse) в System.Web.Services.Protocols.ServerProtocolFactory.Create (тип типа, контекст HttpContext, запрос HttpRequest, ответ HttpResponse, логическое значение и abortProcessing) --- Конец внутренней трассировки стека исключений ---

Если я добавлю имя метода в url, я получу такую ​​ошибку:

Неизвестный веб-метод GetRecordJson. Имя параметра: methodName Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.

Сведения об исключении: System.ArgumentException: неизвестный веб-метод GetRecordJson. Имя параметра: methodName

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


person Alexander Gharibashvili    schedule 13.12.2011    source источник


Ответы (1)


Пара вещей на стороне сервера:

Метод не должен быть статичным. Это только в случае «страничных методов» на страницах ASPX.

Во-вторых, вам нужно украсить класс обслуживания атрибутом [ScriptService], чтобы иметь возможность общаться с ним в JSON, что, как я предполагаю, вы, вероятно, захотите сделать, поскольку используете jQuery.

[ScriptService]
public class BudgetJson : System.Web.Services.WebService {
  [WebMethod]
  public String GetRecordJson()
  {
    return " Hello Master, I'm Json Data ";
  }
}

На стороне клиента вам нужно указать, какой метод вы хотите выполнить, в своем $.ajax() URL:

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

person Dave Ward    schedule 13.12.2011
comment
@AlekoGharibashvili Изначально я пропустил клиентскую проблему. Обновил свой ответ. - person Dave Ward; 13.12.2011
comment
Также обновлен скрипт на стороне клиента, но ничего нового. Работает ли этот код на вашем компьютере? есть ли какие-то проблемы с конфигурациями? если этот код работает на вашем компьютере, поделитесь файлом web.config ... - person Alexander Gharibashvili; 13.12.2011
comment
@AlekoGharibashvili Требования к конфигурации зависят от того, какую версию ASP.NET вы используете. Взгляните на это: encosia.com/ - person Dave Ward; 13.12.2011
comment
Этот проект работает на .net 2.0. мой файл web.config также похож на ваш образец. Есть ли проблема с IIS? - person Alexander Gharibashvili; 13.12.2011
comment
@AlekoGharibashvili Вам нужно будет установить расширения ASP.NET Ajax на сервере, чтобы они работали с ASP.NET 2.0 (как упоминалось в сообщении, на которое я ссылался в своем последнем комментарии; делайте то, что он говорит, и он должен работать). - person Dave Ward; 13.12.2011