Как передать параметры в метод веб-сервиса [OperationContract] из jquery / ajax? - PullRequest
1 голос
/ 09 декабря 2010

Я хотел бы передать параметры в мой веб-сервис из jquerys ajax. Как я могу это сделать?

Я уже просмотрел несколько связанных вопросов, но не смог найти решение, которое сработало бы для меня. Я пробовал это: JQuery AJAX параметр не передается в MVC , но я не использую mvc, поэтому я уверен, что именно поэтому решение не работает Мой jquery выглядит так:

            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "CarService.svc/GetCar",
                data: {CarID:117},
                dataType: "json",
                success: function (data) {
                    $("#lblCurrentTime").text("");
                    $("#lblCurrentTime").text(data.d.CarID);
                }
            });

Что-то не так с моей частью данных, правильно? Если оставить data: part как data: "{}", я смогу запустить мой метод (и не передаю никаких параметров), но в тот момент, когда я попробую описанный выше файербаг, я скажу:

Firebug's log limit has been reached. 0 entries not shown.  Preferences  
POST http://localhost:64461/TimeService.svc/GetCar
POST http://localhost:64461/TimeService.svc/GetCar

500 Internal Server Error
  1.12s

Мой веб-сервис выглядит так:

[OperationContract]
    public CarTable GetCar(int id)
    {
        using (var sqlc = new SqlConnection(@"sdfgsdfg"))
        {
            sqlc.Open();
            var cmd = sqlc.CreateCommand();
            cmd.CommandText = "HUGE QUERY HERE ^^";
            //id = 117;
            cmd.Parameters.Add("CarID", System.Data.SqlDbType.Int).Value = id;
            using (var reader = cmd.ExecuteReader())
            {
                CarTable Cars = new CarTable();

                while (reader.Read())
                {
                    Cars.CarID = reader["CarID"].ToString();
                    Cars.CarName = reader["CarName"].ToString();
                }


                return Cars;

            }
        }
    }
[DataContract]
public class CarTable
{
    [DataMember]
    public string CarID { get; set; }
    [DataMember]
    public string CarName { get; set; }
}

РЕДАКТИРОВАТЬ: Если я изменить часть данных на:

data: CarID=117,

Я получаю Sys.ParameterCountException: несоответствие количества параметров. [Прервать эту ошибку] ​​{имя: "формат", тип: String}

Ответы [ 4 ]

2 голосов
/ 09 декабря 2010
data: {CarID:117}, 

должно быть:

data: "{'id':'117'}", 

Параметр данных должен быть строкой.Пары имени и значения должны быть заключены в кавычки, чтобы быть действительными в формате JSON.Имя пары имя / значение должно соответствовать входному параметру веб-службы.

2 голосов
/ 09 декабря 2010

Сначала убедитесь, что вы включили атрибут

[WebInvoke (ResponseFormat = WebMessageFormat.Json)]

к GetCar методу или сделайте то же самое в web.config.

Во-вторых, вы должны использовать data:"117" или data:JSON.stringify(117) вместо data: {feat:117}.

ОБНОВЛЕНО: Если требуется более сложный ввод данных, например, в качестве объекта CarTable, параметр data должен быть data:JSON.stringify({CarID: 117, CarName: "BMW"}), поэтому он должен быть построен таким же образом. JSON.stringify определяется в http://www.json.org/js.html.

Еще одно замечание. После успешного возврата данных вы увидите, что к возвращенным данным следует обращаться не с data.d.CarID, а с data.CarID. Веб-сервис ASMX размещает данные в свойстве d, но не в сервисе WCF.

ОБНОВЛЕНО 2 : Я не знаю, какую маленькую ошибку вы делаете, поэтому я создал небольшой сервис WCF, который делает то, что вам нужно. Вы можете скачать исходный код здесь http://www.ok -soft-gmbh.com / jQuery / WcfData.zip . Чтобы быть уверенным, что вы сможете его скомпилировать, я использовал Visual Studio 2008. В Visual Studio 2010 файл web.config может быть намного проще.

1 голос
/ 31 марта 2012

попробуйте изменить

data: {CarID:117},

на data: {id:117},

0 голосов
/ 09 декабря 2010

Я думаю, что имя параметра должно соответствовать вызову службы.

Попробуйте изменить

data: {CarID:117},

на data: {ID:117},

...