【问题标题】:Using JSON to Call Web Service from jQuery [duplicate]使用 JSON 从 jQuery 调用 Web 服务 [重复]
【发布时间】:2013-10-14 20:33:02
【问题描述】:

多么痛苦!我正在尝试从 JavaScript 调用 Web 服务,但我似乎找不到让它工作所需的魔法酱。

我的代码如下所示:

JavaScript:

$.ajax({
    url: "/Services/CompanyContactServices.asmx/AddContact",
    type: 'POST',
    contentType: "application/json",
    dataType: "json",
    data: {
        companyId: 3725, firstName: firstName, lastName: lastName, email: email
    },
    success: function (data) {
        alert('Success!');
    },
    error: function (jqXHR, textStatus, errorThrown) {
        alert(errorThrown);
    }
});

网络服务 (asmx.cs):

[WebService(Namespace = CompanyListServices.XmlnsNamespace)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class CompanyContactServices : System.Web.Services.WebService
{
    public const string XmlnsNamespace = "mynamespace";

    [WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string AddContact(int companyId, string firstName, string lastName, string email)
    {
        return new JavaScriptSerializer().Serialize(0);
    }
}

我的AddContact 方法开始处的断点永远不会到达。

我的ajax() 调用的error 处理程序在jqXHR 中包含以下错误消息:

{ Message":"无效的 JSON 原语:companyId。", "StackTrace":"在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject() 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度) 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串输入,Int32 depthLimit,JavaScriptSerializer 序列化程序) 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化程序,字符串输入,类型类型,Int32 depthLimit) 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](字符串输入) 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext 上下文,JavaScriptSerializer 序列化程序) 在 System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context) 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"} "

Chrome 报告以下网络数据:

请求网址:.../Services/CompanyContactServices.asmx/AddContact

请求方法:POST

状态码:500 内部服务器错误

谁能看到我错过了什么?

【问题讨论】:

  • 您可能希望查看 ASP.NET Web-API 以便在后端有更轻松的时间。当然,如果您想在 Web 方法中对 json 序列化和内容进行微观管理,您可以坚持使用旧技术...

标签: c# jquery ajax web-services asmx


【解决方案1】:
{ companyId: 3725, firstName: firstName, lastName: lastName, email: email }

上面的代码是一个 javascript 对象,而不是 JSON。 JSON 是 javascript 对象的字符串表示形式。现代浏览器已经实现了json.stringify,但是如果你打算控制降级,你需要一个像JSON3这样的polyfill。

例子:

var company = {companyId: 3725, firstName: firstName, lastName: lastName, email: email};
var json = JSON.stringify(company);

【讨论】:

  • 是的,这修复了它(鉴于@Blazemonger 将 JSON 全部设为大写)。
  • 是的,我的错。请标记为答案。
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多