尝试发布数据时,使用 Jquery 调用 .Net Web 服务会导致问题

Posted

技术标签:

【中文标题】尝试发布数据时,使用 Jquery 调用 .Net Web 服务会导致问题【英文标题】:Calling .Net webservice with Jquery is causing woe when trying to post data 【发布时间】:2010-10-04 08:09:34 【问题描述】:

以下代码在 data 键没有要发送的数据时正确执行,即 data: "" 一个空的 JSON 对象并且 web 服务不带参数。我想将一些数据发布到网络服务,但我遇到了麻烦。

当我尝试将其设置为 data:"'name':'Niall','surname':'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"

webservice 没有执行。

这是我的 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 数据的格式吗?可能是我没有在我的 WebService 上设置正确的属性。 Dave Ward's post中提到的问题呢

我已经尝试了我能想到的一切。有人有什么想法吗?

【问题讨论】:

【参考方案1】:

这应该可行。您应该将 json 作为字符串传递,参数名称为“json”(与 Web 方法中的参数名称相同。

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

【讨论】:

我已经找了 4 个小时了。为什么 JSON.stringify 不能根据 javascript 变量名添加这个?【参考方案2】:

我认为网络服务希望设置参数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

【讨论】:

+1,这让我解决了我的问题。由于他期望 json 是一个字符串而不是服务中的复杂类型,因此它实际上应该是 var data = 'json':'niall'; 后面跟着 data: JSON.stringify(data),【参考方案3】:

当我不使用双引号将字符串数据括起来时,这总是发生在我身上

【讨论】:

【参考方案4】:

上面的解决方案对我不起作用。所以我做了以下事情。 1.) 确保 javascript 对象属性(此处为 ID 和数量)确实与您的 Web 服务的参数具有相同的名称和相同的类型(在本例中为 number == int) 2.) 不要将对象包装到数据传输对象 (DTO) 中,而是将它们字符串化 感谢Yasin Tarim,它提供了我需要让它工作的提示

// 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 服务器端代码 [WebMethod(Description = "将商品添加到 ShoppingCart")] [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] 公共字符串 AddItemToBasket(int ID, int Quantity) CartItem cI = new CartItem(); cI.iD = ID; cI.qty = 数量; CartItem.SaveToDatabase(ci); 返回“来自 Web 服务的 foo - 它有效”;

【讨论】:

“没有为类型定义无参数构造函数”和“无效的 JSON 原语”和“无效的 Web 服务调用,参数缺失值”是我在各种组合中收到的错误消息。 是的,这也适用于我......我必须在服务器端代码中按类型和名称添加每个变量,否则它不起作用..至少对我来说不是,所以每个变量你have in 你的 json 字符串也需要在后端。

以上是关于尝试发布数据时,使用 Jquery 调用 .Net Web 服务会导致问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 调用 ASP.NET Web 服务?

在 jQuery 数据表中调用 ajax 时没有得到响应

如何使用html和jquery通过asp.net核心api调用获取数据?

扩展从 JQuery 调用 Web 服务时从 ASP.NET 引发的异常

从 .Net 应用程序访问 SharePoint 数据时处理凭据

ASP.net jQuery调用webservice返回json数据的一些问题