簡體   English   中英

如果Model具有Int64,則放置/發布json不能與ODataController一起使用

[英]Put/Post json not working with ODataController if Model has Int64

我有一個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控制器發布/放置對象時:

partial class RelationLineOfBusinessController:ODataController {

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

實體對象為null並且我的模型狀態中存在錯誤:

“無法將原始值轉換為預期類型'Edm.Int64'。有關更多詳細信息,請參閱內部異常。”

我注意到當我使用以下網址獲取對象時:

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”:“初級保健醫生“,”StartDate“:”2012-01-01T00:00:00“,”EndDate“:”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“,” Lineofbusiness“:”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(如果需要)。

我的問題是一個寧靜的服務立場 - 有沒有一種方法可以配置/編碼寧靜的服務,以便像JSON一樣接受AssignedNbr,而不是引號。

或者從JSON的角度來看,他是一種可以在不進入序列化業務的情況下構建JSON的方式,如果他們想要針對我們的休息服務編寫自己的應用程序,我也不希望我們的客戶處理自定義序列化程序。

有什么建議么?

謝謝。

我認為您可以遷移到適用於OData V4的Web API 2.2。 這是信息:

宣布發布ASP.NET MVC 5.2,Web API 2.2和Web Pages 3.2

OData V4 Spec說:

3.2控制數字的表示

IEEE754Compatible = true格式參數表示服務必須將Edm.Int64和Edm.Decimal數字(包括odata.count,如果請求)序列化為字符串。 如果未指定或指定為IEEE754Compatible = false,則所有數字必須序列化為JSON數字。

這樣可以支持定義為64位二進制格式IEEE 754值[ ECMAScript ](參見第4.3.1.9節)的JavaScript數字,導致整數丟失精度超過15位,並且由於從基數10轉換為十進制而導致精度丟失base 2.將Edm.Int64和Edm.Decimal值格式化為字符串的OData JSON有效負載必須在Content-Type標頭中返回的媒體類型中指定此格式參數。

因此,對於有效載荷:

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

你應該設置:

request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;IEEE754Compatible=true");

否則,你不應該。

Sam Xu完全正確,應該標記為答案。

但是,我想准確添加您需要做的事情以將其添加到管道中。

首先,您可以設置此全局,每條路線等。您可以在此處找到該信息: http//www.asp.net/web-api/overview/advanced/http-message-handlers

您將在下面找到一個可行的示例。

public static void Configuration(IAppBuilder builder)
    {
        HttpConfiguration config = new HttpConfiguration();       

        config.MessageHandlers.Add(new MethodOverrideHandler());
    }

public class MethodOverrideHandler : DelegatingHandler
{       
    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;IEEE754Compatible=true");

        return base.SendAsync(request, cancellationToken);
    }
}

或者,嘗試將發送到Web api的類型更改為Number而不是string

另外,檢查要發送的小數類型。 如果是'string'類型,您可以將其更改為類型編號。 對於我的服務,進行此更改不再引發錯誤。

//Gnuget Package Manager Install-Package numeral  

if (typeof newValue === 'string') 
{
newValue = numeral().unformat(newValue);
}

  odatajs.oData.request(
             {
                 requestUri: xxx,
                 method: "PATCH",
                 data: { PriceNull: newValue }
             }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM