2017-05-22 22 views
0

WebAPI 2/Newtonsoft.Json 9.0.1を使用しており、デシリアライズの問題が発生しています。私は唯一のパラメータとしてDTOを取るエンドポイントを持っています。メソッドが呼び出されると、DTOプロパティのうちの1つだけが直列化復元され、残りのプロパティはNULLまたはデフォルト値になります。この問題は、型が具体的な型ではなくインタフェースであるネストされたプロパティによって引き起こされています。これは、同じ問題が報告されているhereです。C#WebAPI 2デシリアライゼーションでNullが発生するが例外が発生しない

私はどちらかの具体的なタイプにタイプを変更するか、次のような既存のインタフェースのプロパティにタイプ初期化子を追加することで問題を解決できることを知っている:

IAddressDTO Address { get; set; } = new AddressDTO(); 

私の質問は:なぜノーでありますデシリアライズ時に.NET例外/エラーがスローされる?デシリアライズに問題がある場合は、どこでも「null」を使用するのではなく、実行時に知りたいと思います。これは私が期待していたように例外がスローされた場合には避けられた、Productionの私にとって大きな問題を引き起こしました。

次のような単体テストを作成すると、例外がスローされます。どのようにWebAPIがこの例外を飲み込んでいるのですか?それをやめさせる方法を教えてください。カスタムフィルタなどが必要ですか?これは、デフォルトの動作でなければならないようです。

ここでは、WebAPIエンドポイントの実行時に見たい例外をスローするNUnitテストを示します。

[Test] 
public void DeserializationIssue() 
{ 
    string json = @"{ 
     ""OrderNumber"":155, 
     ""Person"":{ 
      ""FirstName"":""AAAA"", 
      ""LastName"":""B"", 
      ""Address"":{ 
       ""line1"":""1234 Easy St"", 
      } 
     } 
    }"; 
    PatientDTO patientDTO = JsonConvert.DeserializeObject<PatientDTO>(json); 
    Assert.That(patientDTO.Person.Address.Line1, Is.EqualTo("1234 Easy St")); 
} 
+0

回答が見つかりました。https://stackoverflow.com/questions/28835869/capture-exception-during-request-deserialization-in-webapi-c-sharp – Andy

答えて

0

RE:逆シリアル化中に.NET例外/エラーがスローされないのはなぜですか?

私は例外が発生しており、あなたがそれを検出するように設定されていないと思います。 webapiとグローバル例外処理の詳細は、https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/web-api-global-error-handlingを参照してください。

データが疑わしい場合、このデシリアライズが失敗する可能性があることがわかっている場合は、try/catchでラップして適切な処置を取ってください。

関連する問題