Dataverse Web API クライアント エラーのトラブルシューティング
この記事では、 Dataverse Web API を使用するときに発生する可能性がある一般的なクライアント エラーと、それらを回避する方法について説明します。
セグメントのリソースが見つかりません
現象
要求
GET [Organization URI]/api/data/v9.2/Account HTTP/1.1
Response
HTTP/1.1 404 Not Found
{
"error": {
"code": "0x8006088a",
"message": "Resource not found for the segment 'Account'."
}
}
原因
このエラーは、リソースの名前が正しくない場合に発生します。 そのリソースは、エンティティ セットの名前、関数、またはアクションである可能性があります。 これらのリソース名では、大文字と小文字が区別されます。 前の例では、 というエンティティ セットがありますが、 という accounts
名前 Account
のエンティティ セットはありません。
リソースがカスタム プロセス アクションとして定義されたアクションである場合、 カスタム プロセス アクションが非アクティブな場合にもこのエラーが発生する可能性があります。
回避する方法
- リソースがエンティティ型の場合は、既知のすべてのエンティティ セット名の一覧を提供する Web API Service ドキュメント に対してクエリを実行します。
- リソースが関数またはアクションの場合は、使用する名前が CSDL $metadata ドキュメントに存在することを確認します。
- CSDL $metadata ドキュメントにアクションが存在しない場合は、非アクティブなカスタム プロセス アクションである可能性があります。 アクティブであることを確認する必要があります。
型 'Microsoft.Dynamics.CRM' の '{property name}' という名前のプロパティが見つかりませんでした。{entity name}'
現象
要求
GET [Organization URI]/api/data/v9.2/accounts?$select=Name HTTP/1.1
Response
HTTP/1.1 400 Bad Request
{
"error": {
"code": "0x0",
"message": "Could not find a property named 'Name' on type 'Microsoft.Dynamics.CRM.account'."
}
}
原因
このエラーは、プロパティの名前が正しくない場合に発生します。 プロパティ名では、大文字と小文字を区別します。
前の例では、 という名前 name
のプロパティがありますが、 という名前 Name
のプロパティはありません。
回避する方法
使用する名前が CSDL $metadata ドキュメントに存在することを確認します。 詳細については、「 Web API のプロパティ」を参照してください。
要求 URI に一致する HTTP リソースが見つかりませんでした
現象
要求
POST [Organization URI]/api/data/v9.2/WhoAmI
Response
HTTP/1.1 404 Not Found
{
"error": {
"code": "",
"message": "No HTTP resource was found that matches the request URI '[Organization URI]/api/data/v9.2/WhoAmI'."
}
}
原因
このエラーは、正しくない HTTP メソッドが関数またはアクションに適用された場合に発生します。 この場合、 WhoAmI 関数 では を使用 GET
する必要がありますが、使用 POST
されました。
回避する方法
使用している OData 操作の種類と、使用する適切な HTTP メソッドに注意してください。 詳細については、以下を参照してください:
エンティティ 'Microsoft.Dynamics.CRM で無効なプロパティ {プロパティ名} が見つかりました。{entity name}'
現象
要求
POST [Organization URI]/api/data/v9.2/accounts HTTP/1.1
{
"Name": "Account name"
}
Response
HTTP/1.1 400 Bad Request
{
"error": {
"code": "0x0",
"message": "An error occurred while validating input parameters:
Microsoft.Crm.CrmException: Invalid property 'Name' was found in entity 'Microsoft.Dynamics.CRM.account'.
---> Microsoft.OData.ODataException: Does not support untyped value in non-open type.<truncated for brevity>"
}
}
原因
このエラーは、プロパティの名前が正しくないために発生します。 プロパティ名は大文字と小文字が区別され Name
、 ではなく name
使用されました。
回避する方法
使用するプロパティ名が CSDL $metadata ドキュメントに存在することを確認します。 詳細については、「 Web API のプロパティ」を参照してください。
Entity '{entity name}' のユーザーによって提供されるペイロードで識別されるエラー
このエラーでは、2 つの異なる問題が発生する可能性があります。 違いは InnerException にあります。
- InnerException: Microsoft.OData.ODataException: ペイロードに宣言されていないプロパティ [...] が見つかりました。
- InnerException : System.ArgumentException: Stream が読み取れなかった。
InnerException: Microsoft.OData.ODataException: ペイロードに宣言されていないプロパティ [...] が見つかりました
このエラーは、無効なナビゲーション プロパティ名が要求と共に送信されたときに発生します。
現象
要求
POST [Organization URI]/api/data/v9.0/contacts HTTP/1.1
{
"firstname":"test",
"lastname":"contact",
"parentcustomerid@odata.bind": "accounts(a779956b-d748-ed11-bb44-6045bd01152a)"
}
Response
HTTP/1.1 400 Bad Request
{
"error": {
"code": "0x80048d19",
"message": "Error identified in Payload provided by the user for Entity :'contacts' ---->
InnerException : Microsoft.OData.ODataException: An undeclared property 'parentcustomerid'
which only has property annotations in the payload but no property value was found in the payload.
In OData, only declared navigation properties and declared named streams can be represented as
properties without values <truncated for brevity>".
}
}
原因
このエラーは、 という名前 parentcustomerid
の連絡先エンティティ型に単一値ナビゲーション プロパティがないために発生します。 詳細については、「 EntityType > の単一値ナビゲーション プロパティ」を参照してください。
parentcustomerid
は、連絡先テーブル内の参照列の論理名です。 すべての参照は、OData の単一値ナビゲーション プロパティによって表されます。 参照プロパティの名前は、対応する単一値ナビゲーション プロパティ名と常に一致するとは限りません。
この場合、 parentcustomerid
列は顧客参照の種類であり、アカウントまたは連絡先テーブルのいずれかにリンクする可能性がある一種の マルチテーブル参照 です。 この顧客参照をサポートするために、2 つの個別のリレーションシップがあり、それぞれ異なる単一値ナビゲーション プロパティがあります。 この場合の正しい単一値ナビゲーション プロパティは です parentcustomerid_account
。
回避する方法
使用するナビゲーション プロパティ名が CSDL $metadata ドキュメントに存在することを確認します。 詳細については、「 Web API ナビゲーション プロパティ」、特に 「複数テーブル参照 」セクションを参照してください。
InnerException : System.ArgumentException: Stream が読み取り可能ではなかった
このエラーは、 バッチ操作を実行するときに発生します。
現象
要求を送信すると、次の $batch
エラーが発生します。
Response
HTTP/1.1 400 Bad Request
--batchresponse_5bd81edb-2ef9-4269-85c3-4623981e6c6e
Content-Type: application/http
Content-Transfer-Encoding: binary
HTTP/1.1 400 Bad Request
REQ_ID: 4c8c75eb-10bf-47f9-9998-c119146d511f
Content-Type: application/json; odata.metadata=minimal
OData-Version: 4.0
{"error":{"code":"0x80048d19","message":"Error identified in Payload provided by the user for Entity :'accounts',
For more information on this error please follow this help link https://go.microsoft.com/fwlink/?linkid=2195293
----> InnerException : System.ArgumentException: Stream was not readable.\r\n
at System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean leaveOpen)\r\n
at System.IO.StreamReader..ctor(Stream stream, Encoding encoding)\r\n
at Microsoft.OData.JsonLight.ODataJsonLightInputContext.CreateTextReader(Stream messageStream, Encoding encoding)\r\n
at Microsoft.OData.JsonLight.ODataJsonLightInputContext..ctor(ODataMessageInfo messageInfo, ODataMessageReaderSettings messageReaderSettings)\r\n
at Microsoft.OData.Json.ODataJsonFormat.CreateInputContext(ODataMessageInfo messageInfo, ODataMessageReaderSettings messageReaderSettings)\r\n
at Microsoft.OData.ODataMessageReader.ReadFromInput[T](Func`2 readFunc, ODataPayloadKind[] payloadKinds)\r\n
at System.Web.OData.Formatter.Deserialization.ODataResourceDeserializer.Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)\r\n
at System.Web.OData.Formatter.ODataMediaTypeFormatter.ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)."}}
--batchresponse_5bd81edb-2ef9-4269-85c3-4623981e6c6e--
原因
この逆シリアル化エラーは、バッチ要求本文で CRLF 以外の行末が使用されていることが原因で発生します。
使用するエディターによっては、これらの印刷以外の文字が見えにくい場合があります。 Notepad++ を使用する場合は、[すべての文字を表示] オプションを使用して、これらの文字を表示できます。
このペイロードは次の機能を持ちます。
最後の行が で CRLF
終わらないため、このペイロードは失敗します。
この場合、最後の行の末尾に復帰を追加するだけで十分です。
回避する方法
要求本文のすべての行末尾が $batch
であることを CRLF
確認します。 を使用 CRLF
できない場合は、バッチ要求本文の末尾に 2 つの行以外CRLF
の末尾を追加して、この逆シリアル化エラーを解決します。 詳細については、「 Batch 要求」を参照してください。