2015-05-07 16 views
3

我正在将WCF数据服务迁移到Web API odata v4。WebApi odata:序列化字符串的长度为

{ 
    "value":[{ 
    "ID":"4527895973896126465" 
    },{ 
    "ID":"4527895973896126466" 
    }] 
} 

的Web API的OData不:

{ 
    "value":[{ 
    "ID":4527895973896126465 
    },{ 
    "ID":4527895973896126466 
    }] 
} 

这意味着我失去了64位数值的精度JSON.parse过程中的JavaScript,JavaScript的,因为WCF数据服务的报价确实serilize长值数字只有53bit。

WebApi是否有构建机制来处理字符串值的长整型值?我正在考虑头部元素为IEEE754Compatible。但是这对生成的响应没有影响。我可以忽略一些东西吗

另一种解决方案是在客户端的JSON.parse期间将64位数作为字符串值进行取舍。这可能吗?

回答

1

最后我得到这个上班。 OdataLib的确支持这个由IEEE754Compatible参数。它检查响应Content-Type头以查看参数是否存在。

事情是,头部值不会自动获得web api框架的响应头部。你必须自己做。我已经建立一个ODataController派生类补丁的IEEE754Compatible参数到像这样的响应的Content-Type头:通过在Content-Type头发送IEEE754Compatible = true参数我收到的所有长

public abstract class ODataControllerIEEE754Compatible : ODataController 
{ 
    private void PatchResponse(HttpResponseMessage responseMessage) 
    { 
     if (responseMessage != null && responseMessage.Content != null) 
     { 
      if (this.Request.Content.Headers.GetValues("Content-Type").Any(
       h => h.Contains("IEEE754Compatible=true"))) 
      { 
       responseMessage.Content.Headers.TryAddWithoutValidation(
        "Content-Type", "IEEE754Compatible=true"); 
      } 
     } 
    } 

    public override Task<HttpResponseMessage> ExecuteAsync(
     HttpControllerContext controllerContext, CancellationToken cancellationToken) 
    { 
      var response = base.ExecuteAsync(
       controllerContext, cancellationToken); 
      response.Wait(cancellationToken); 

      PatchResponse(response.Result); 

      return response; 
    } 
} 

现在值序列化为JSON字符串:

GET http://localhost/some/url HTTP/1.1 
OData-Version: 4.0; 
Content-Type: application/json;odata.metadata=minimal;IEEE754Compatible=true;charset=utf-8 
Cache-Control: no-cache 

HTTP/1.1 200 OK 
Content-Type: application/json;odata.metadata=minimal;IEEE754Compatible=true 
Server: Microsoft-HTTPAPI/2.0 
OData-Version: 4.0 

{ 
    "@odata.context":"http://localhost/some/url","value":[ 
{ 
    "ID":"4527895973896126465", ... 
1

虽然我对ASP.net了解不多,但我可以给你一个rexeg,它可以用来在JSON的大数字周围添加引号。在这里,我将它设置为16位或更多的数字。

http://jsfiddle.net/yryk70qz/1/
value.replace(/:\s*(\d{16,})(\s*[,\}])/g, ':"$1"$2');

你可以与所有数字以做到这一点不论其长度:
value.replace(/:\s*(\d+)(\s*[,\}])/g, ':"$1"$2');

(被这个问题inpired:Convert all the integer value to string in JSON

+1

感谢您的支持。我可以用它作为“最后的手段”,但是我想知道在JSON.parse期间是否可以实现这个(或者类似的)(为了获得更好的性能)。最好的办法是获得我在服务器端使用wcf数据服务的旧行为。 – Jeldrik