gpt4 book ai didi

json - 如果模型具有 Int64,则放置/发布 json 不适用于 ODataController

转载 作者:行者123 更新时间:2023-12-01 07:56:26 26 4
gpt4 key购买 nike

我有一个带有 Int64 列的数据对象:

[TableAttribute(Name="dbo.vw_RelationLineOfBusiness")]
[DataServiceKey("ProviderRelationLobId")]
public partial class RelationLineOfBusiness
{

#region Column Mappings
private System.Guid _Lineofbusiness;
private System.String _ContractNumber;
private System.Nullable<System.Int32> _ProviderType;
private System.String _InsuredProviderType;
private System.Guid _ProviderRelationLobId;
private System.String _LineOfBusinessDesc;
private System.String _CultureCode;
private System.String _ContractDesc;
private System.Nullable<System.Guid> _ProviderRelationKey;
private System.String _ProviderRelationNbr;
**private System.Int64 _AssignedNbr;**

当我使用 HttpClient 和 NewtsonSoft 通过我的 OData Controller 发布/放置对象时:

部分类 RelationLineOfBusinessController : ODataController
{

public HttpResponseMessage PutRelationLineOfBusiness([FromODataUri] System.Guid key, Invidasys.VidaPro.Model.RelationLineOfBusiness 实体)

实体对象为空,我的模型状态中的错误:

“无法将原始值转换为预期的类型 'Edm.Int64'。有关更多详细信息,请参阅内部异常。”

我注意到当我使用以下 URL 获取我的对象时:

Invidasys.Rest.Service/VidaPro/RelationLineOfBusiness(guid'c6824edc-23b4-4f76-a777-108d482c0fee')

我的 json 如下所示 - 我注意到 AssignedNbr 被视为字符串。

{
"odata.metadata":"Invidasys.Rest.Service/VIDAPro/$metadata#RelationLineOfBusiness/@Element",
"Lineofbusiness":"ba129c95-c5bb-4e40-993e-c28ca86fffe4","ContractNumber":null,"ProviderType":null,
"InsuredProviderType":"PCP","ProviderRelationLobId":"c6824edc-23b4-4f76-a777-108d482c0fee",
"LineOfBusinessDesc":"MEDICAID","CultureCode":"en-US","ContractDesc":null,
"ProviderRelationKey":"a2d3b61f-3d76-46f4-9887-f2b0c8966914","ProviderRelationNbr":"4565454645",
"AssignedNbr":"1000000045" ,"Ispar":true,"ProviderTypeDesc":null,"InsuredProviderTypeDesc":"Primary Care Physician",
"开始日期":"2012-01-01T00:00:00","结束日期":"2014-01-01T00:00:00","创建时间":"2014-06-13T10:59:33.567",
"CreatedBy":"Michael","Updated":"2014-06-13T10:59:33.567","UpdatedBy":"Michael"
}

当我使用 httpclient 执行 PUT 时,JSON 显示在我的 Restful 服务中,如下所示,并且 AssignedNbr 列的 json 不在引号中,这导致 restful 服务无法将 JSON 构建回对象。我使用了 JSON 并将 AssignedNbr 放在引号中,并且请求正确通过。

{ "AssignedNbr":1000000045 ,"ContractDesc":null,"ContractNumber":null,"Created":"/Date(1402682373567-0700)/",
"CreatedBy":"Michael","CultureCode":"en-US","EndDate":"/Date(1388559600000-0700)/","InsuredProviderType":"PCP",
"InsuredProviderTypeDesc":"Primary Care Physician","Ispar":true,"LineOfBusinessDesc":"MEDICAID",
"业务线":"ba129c95-c5bb-4e40-993e-c28ca86fffe4","ProviderRelationKey":"a2d3b61f-3d76-46f4-9887-f2b0c8966914",
"ProviderRelationLobId":"c6824edc-23b4-4f76-a777-108d482c0fee","ProviderRelationNbr":"4565454645","ProviderType":null,
"ProviderTypeDesc":null,"StartDate":"/Date(1325401200000-0700)/","Updated":"/Date(1408374995760-0700)/","UpdatedBy":"ED"}

我们想要将我们的业务模型公开为 Restful 服务的原因是隐藏任何数据验证并以易于开发的格式公开我们的所有数据库。我查看了 DataServiceContext 以查看它是否可以工作,但它使用 XML 在 Restful 服务和客户端之间进行通信。哪个可行,但 DataServiceContext 没有提供 HttpRequestMessage/HttpResponseMessage 为我提供的消息级别,用于通过他们的帖子通知用户错误/缺失信息。

我们计划从我们的 Restful 服务平台支持多个设备,但这需要我可以使用 NewtonSoft Json 以及 Microsoft 的 DataContractJsonSerializer(如果需要)。

我的问题是从 Restful 服务的角度来看 - 有没有一种方法可以配置/编码 Restful 服务以在没有引号的情况下采用 JSON 中的 AssignedNbr。

或者从 JSON 的角度来看是他们的一种方式,我可以在不进入序列化业务的情况下构建 JSON,如果他们想针对我们的 Restful 服务编写自己的应用程序,我也不希望我们的客户处理自定义序列化程序。

有什么建议?

谢谢。

最佳答案

我认为您可以迁移到 OData V4 的 Web API 2.2。以下是信息:

Announcing the Release of ASP.NET MVC 5.2, Web API 2.2 and Web Pages 3.2

OData V4 Spec说:

3.2 控制数字的表示

IEEE754Compatible=true 格式参数指示服务必须将 Edm.Int64 和 Edm.Decimal 数字(包括 odata.count,如果请求)序列化为字符串。如果未指定,或指定为 IEEE754Compatible=false,则所有数字都必须序列化为 JSON 数字。

这支持定义为 64 位二进制格式 IEEE 754 值的 JavaScript 数字 [ ECMAScript ](参见第 4.3.1.9 节)导致超过 15 位的整数失去精度,并且由于从基数 10 到基数 2 的转换而导致小数失去精度。
将 Edm.Int64 和 Edm.Decimal 值格式化为字符串的 OData JSON 有效负载必须在 Content-Type header 中返回的媒体类型中指定此格式参数。

因此,对于有效载荷为:

@"{ 
""Lineofbusiness"": ""ba129c95-c5bb-4e40-993e-c28ca86fffe4"",
""AssignedNbr"": ""1000000045""
}";

你应该设置:
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;IEEE754Compatible=true");

否则,你不应该。

关于json - 如果模型具有 Int64,则放置/发布 json 不适用于 ODataController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25367726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com