【问题标题】:Sending a long (Int64) via JSON to a WCF Data Service通过 JSON 将 long (Int64) 发送到 WCF 数据服务
【发布时间】:2012-03-07 08:57:32
【问题描述】:

我在通过 HTTP 向 WCF 数据服务 (OData) 执行 PUT 请求时遇到问题。问题是身份证。它不是自动生成的,我无法更改数据库设置(在这种情况下不允许)。因此,当我尝试提交 ID 时,它会发送正确的 ID 但不是正确的类型...

显然,该服务需要一个 Int64 作为 ID,并且无法解析我的输入。 这是代码:

 function OnCreateDisplay() {
     $('#DisplayInfoLoader').html('<span style="color: orange;">Creating object....</span>');
     $('#DisplayInfoLoader').fadeIn(1000);

     var url = "....";

     var r = new Object();
     r.DisplayID = NextDisplayID+"L";
     r.Name = $("#FDisplayName").val();
     r.Code = parseInt($("#FDisplayCode").val());
     r.Status = $("#FDisplayStatus").val();
     r.ProjectID = selected_project+"L";
     r.Description = $("#FDisplayDescription").val();
     jr = JSON.stringify(r);
     alert(jr);

     $.ajax({
         type: "PUT",
         url: url,
         data: jr,
         contentType: "application/json; charset=utf-8",
         success: function (result) {
             $('#DisplayInfoLoader').html('<span style="color: green;">Display created....</span>');
             $('#DisplayInfoLoader').fadeOut(3000);
         },
         error: function (xhr, ajaxOptions, thrownError) {
             alert(xhr.responseText);
             $('#DisplayInfoLoader').html('<span style="color: red;">An Error occured....</span>');
             $('#DisplayInfoLoader').fadeOut(3000);
         }
     });

     LoadProjectDisplays();

     return false;
 }

函数NextDisplayID() 只是获取最后插入的 ID 并将其递增。它就像一个魅力。我已经尝试在它之后添加一个 +"L"(WCF 很喜欢它......)但它就是无法解析!

编辑:

我正在发送这个 JSON 字符串:

{"DisplayID":"132L","Name":"Name","Code":"Code","Status":"0","ProjectID":"1L","Description":"Descr"}

在这个网址上:"http://" + ip + ":8989/Service.svc/Displays("+NextDisplayID+"L)"

IP 是 lan-ip 192.168.0.191

此外,当我继续使用代码时...有时我会收到“找不到“显示”段的资源。”作为错误

放置标题:

PUT /Service.svc/Displays(132L) HTTP/1.1

主机:192.168.0.191:8989

连接:保持活动

内容长度:110

来源:http://192.168.0.191:8989

X-Requested-With: XMLHttpRequest

用户代理:Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11(KHTML,如 Gecko)

Chrome/17.0.963.56 Safari/535.11

内容类型:应用程序/json; charset=UTF-8

接受:/

推荐人:http://192.168.0.191:8989/

接受编码:gzip、deflate、sdch

接受语言:en-GB,nl;q=0.8

接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3

TEXT:DATA 示例 {"DisplayID":"132L","Name":"fdsafsda","代码":"dsafsda","状态":"0","ProjectID":"1L","描述":"fdsafsad"}

tnx 阅读本文

【问题讨论】:

  • 您能否在没有完整代码的情况下获取 HTTP 跟踪(例如使用 Fiddler),很难猜测实际值是什么以及您发送请求的 URL 是什么很快。您返回的确切错误也会有所帮助。

标签: ajax json wcf odata int64


【解决方案1】:

Int64 在 JSON 中被序列化为写成字符串的数字。例如“12345”(包括引号)。此处对此进行了描述:http://www.odata.org/developers/protocols/json-format#PrimitiveTypes

请注意,它与 URL 中使用的格式不同,后者的格式是数字后跟 L(您已经使用过)。

对于 POST 和 PUT,它们有不同的含义。

POST 用于创建新实体,并发送到实体集 URL,所以 .../Displays

PUT 用于更新现有实体,并发送到实体实例 URL(您要更新的实体),因此 .../Displays(1234L)。 另请注意,通常不允许更新密钥属性(在您的情况下为 DisplayID),并且服务器可能会忽略您在 PUT 中从客户端发送的值。因此,在 PUT 的情况下,您可以将其从有效负载中排除。

【讨论】:

    【解决方案2】:

    尝试使用 POST 而不是 PUT... 因为它也用于创建项目。您可能需要调整 URL 并尝试使用或不使用 DisplayID 发送?

    【讨论】:

    • 这不起作用 :( 当我使用 PUT 时,我得到这个“找不到'显示'段的资源。”当我使用 POST 时,我得到了转换。但我做到了必须根据我的决定更改 URL(POST、PUT)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2011-09-25
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多