Вызов .Net webservice с Jquery вызывает горе при попытке опубликовать данные - PullRequest
9 голосов
/ 29 января 2009

Следующий код выполняется правильно, когда у ключа данных нет данных для отправки, то есть data: "{}" пустой объект JSON, а веб-служба не принимает параметров. Я хотел бы опубликовать некоторые данные в веб-сервис, но у меня проблемы.

Когда я пытаюсь установить это для данных: "{'name': 'Niall', 'фамилия': 'Smith'}", я получаю ошибку

{"Message":"Invalid web service call, missing value for parameter: \u0027json\u0027.","StackTrace":"   at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary`2 parameters)\r\n   at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)\r\n   at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

Веб-сервис не выполняется.

Это мой вызов Jquery для отправки моих данных обратно на сервер.

    $.ajax({
        type: "POST",
        url: "/WebServices/BasketServices.asmx/AddItemToBasket",
        data: "{'name':'niall'}", // Is this Correct??
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: OnItemAddedSuccess
    });
function OnItemAddedSuccess(result,eventArgs) {
    //deserialize the JSON and use it to update the Mini Basket
    var response = JSON.parse(result.d);
}

вот мой веб-сервис

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class BasketServices : System.Web.Services.WebService
{
    [WebMethod(true)]
    public string AddItemToBasket(string json)
    {
       //do stuff
       return myString.toJSON();
    }
}

В чем может быть проблема? Это формат данных JSON для публикации? Может быть, я не установил правильные атрибуты на своем веб-сервисе. Как насчет проблем, упомянутых в Пост Дейва Уорда

Я перепробовал все, что мог придумать. У кого-нибудь есть идеи?

Ответы [ 4 ]

12 голосов
/ 29 января 2009

Я думаю, веб-служба ожидает установки параметра json. Попробуйте этот вызов AJAX:

var data = {'name':'niall'};

$.ajax({
    type: "POST",
    url: "/WebServices/BasketServices.asmx/AddItemToBasket",
    data: "json=" + JSON.stringify(data),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: OnItemAddedSuccess
});

где JSON.stringify() - метод, подобный методу, найденному в "официальной" реализации: http://json.org/js.html

5 голосов
/ 29 июня 2011

Решение выше не сработало для меня. Поэтому вместо этого я сделал следующее. 1.) убедитесь, что свойства объекта javascript (здесь ID и количество) имеют то же имя и тот же тип (в данном случае число == int), что и параметр вашего веб-сервиса 2.) не оборачивайте объект в объект передачи данных (DTO), а просто переводите его в строку Спасибо Ясину Тариму , который дал подсказки, необходимые для его работы

// javascript object
var cartItem = {"ID": 123, "Quantity": 2}

$.ajax({
    type: "POST",
    url: "/WebServices/BasketServices.asmx/AddItemToBasket",
    data: JSON.stringify(cartItem),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) { OnSuccess(cartItem, data); },
});
    // ASMX Server Side Code
    [WebMethod(Description = "Add item to ShoppingCart")]
    [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]        
    public string AddItemToBasket(int ID, int Quantity) 
    {            
        CartItem cI = new CartItem();
        cI.iD = ID;
        cI.qty = Quantity;
        CartItem.SaveToDatabase(ci);
        return "foo from Webservice - it worked";
    }
2 голосов
/ 29 января 2009

Это должно работать. Вы должны передать json в виде строки с именем параметра 'json' (которое совпадает с именем параметра в вашем веб-методе.

data: "{json: '{\'name\':\'niall\'}'}",

0 голосов
/ 29 января 2009

Это всегда случается со мной, когда я не заключаю строковые данные в двойные кавычки

...