Dataverse Web API クライアント エラーのトラブルシューティング
この記事では、 Dataverse Web API を使用するときに発生する可能性がある一般的なクライアント エラーと それらを回避する方法について説明します。
セグメントのリソースが見つかりません
現象
Request
GET [Organization URI]/api/data/v9.2/Account HTTP/1.1
回答
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}'
現象
Request
GET [Organization URI]/api/data/v9.2/accounts?$select=Name HTTP/1.1
回答
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 リソースが見つかりませんでした
現象
Request
POST [Organization URI]/api/data/v9.2/WhoAmI
回答
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 で無効なプロパティ {property name} が見つかりました。{entity name}'
現象
Request
POST [Organization URI]/api/data/v9.2/accounts HTTP/1.1
{
"Name": "Account name"
}
回答
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 name}' のユーザーによって提供されるペイロードで識別されるエラー
このエラーで発生する可能性がある問題は 2 つあります。 違いは InnerException にあります。
- InnerException : Microsoft.OData.ODataException: 宣言されていないプロパティ [...] がペイロードで見つかりました。
- InnerException : System.ArgumentException: Stream が読み取れなかった。
InnerException : Microsoft.OData.ODataException: 宣言されていないプロパティ [...] がペイロードで見つかりました
このエラーは、無効なナビゲーション プロパティ名が要求と共に送信されたときに発生します。
現象
Request
POST [Organization URI]/api/data/v9.0/contacts HTTP/1.1
{
"firstname":"test",
"lastname":"contact",
"parentcustomerid@odata.bind": "accounts(a779956b-d748-ed11-bb44-6045bd01152a)"
}
回答
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
という名前の連絡先エンティティ型に単一値ナビゲーション プロパティがないために発生します。 詳細については、「 contact EntityType > 単一値ナビゲーション プロパティを参照してください。
parentcustomerid
は、連絡先テーブル内の参照列の論理名です。 すべての参照は、OData の単一値ナビゲーション プロパティによって表されます。 参照プロパティの名前は、対応する単一値ナビゲーション プロパティ名と常に一致するとは限りません。
この場合、 parentcustomerid
列は顧客参照の種類であり、 multi-table lookup アカウントまたは連絡先テーブルのいずれかにリンクされる可能性があります。 この顧客検索をサポートするために、2 つの異なるリレーションシップがあり、それぞれが異なる単一値ナビゲーション プロパティを持っています。 この場合、正しい単一値ナビゲーション プロパティは parentcustomerid_account
。
回避する方法
使用するナビゲーション プロパティ名が、 CSDL $metadata ドキュメントに存在することを確認します。 詳細については、「 Web API Navigation Properties(特に Multi-table lookups 」セクションを参照してください。
InnerException : System.ArgumentException: Stream が読み取れなかった
このエラーは、バッチ操作を実行場合に発生します。
現象
$batch
要求を送信すると、次のエラーが発生します。
回答
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 要求」を参照してください。