Solución de errores de cliente de Dataverse Web API
En este artículo se describen los errores de cliente comunes que puede encontrar al usar la API web de Dataverse y cómo puede evitarlos.
Recurso no encontrado para el segmento
Síntomas
Solicitar
GET [Organization URI]/api/data/v9.2/Account HTTP/1.1
Respuesta
HTTP/1.1 404 Not Found
{
"error": {
"code": "0x8006088a",
"message": "Resource not found for the segment 'Account'."
}
}
Causa
Este error se produce cuando se usa el nombre incorrecto para un recurso. Ese recurso puede ser el nombre de un conjunto de entidades, una función o una acción. Estos nombres de recursos distinguen mayúsculas de minúsculas. En el ejemplo anterior, hay un conjunto de entidades denominado accounts
, pero no uno denominado Account
.
Si el recurso es una acción definida como una acción de proceso personalizada, este error también puede producirse si la acción del proceso personalizado está inactiva.
Cómo evitar
- Si el recurso es un tipo de entidad, consulte el documento servicio de API web que proporcionará una lista de todos los nombres conocidos del conjunto de entidades.
- Si el recurso es una función o una acción, compruebe que el nombre que usa existe en el documento de $metadata CSDL.
- Si la acción no existe en el documento de $metadata CSDL, puede ser una acción de proceso personalizado inactiva. Debe comprobar que está activo.
No se pudo encontrar una propiedad denominada '{property name}' en el tipo 'Microsoft.Dynamics.CRM'. {nombre de entidad}'
Síntomas
Solicitar
GET [Organization URI]/api/data/v9.2/accounts?$select=Name HTTP/1.1
Respuesta
HTTP/1.1 400 Bad Request
{
"error": {
"code": "0x0",
"message": "Could not find a property named 'Name' on type 'Microsoft.Dynamics.CRM.account'."
}
}
Causa
Este error se produce cuando se usa el nombre incorrecto para una propiedad. Los nombres de propiedad distinguen entre mayúsculas y minúsculas.
En el ejemplo anterior, hay una propiedad denominada name
, pero no una denominada Name
.
Cómo evitar
Compruebe que el nombre que usa existe en el documento de $metadata CSDL. Para obtener más información, consulte Propiedades de api web.
No se encontró ningún recurso HTTP que coincida con el URI de solicitud
Síntomas
Solicitar
POST [Organization URI]/api/data/v9.2/WhoAmI
Respuesta
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'."
}
}
Causa
Este error se produce cuando se aplica el método HTTP incorrecto a una función o acción. En este caso, la función WhoAmI requiere el uso de GET
pero POST
se usó.
Cómo evitar
Tenga en cuenta qué tipo de operación de OData está usando y el método HTTP correcto que se va a usar. Para más información, vea:
- Acciones de la API web
- Usar acciones de la API web
- Funciones de la API web
- Usar funciones de API web
Se encontró una propiedad {nombre de propiedad} no válida en la entidad "Microsoft.Dynamics.CRM". {nombre de entidad}'
Síntomas
Solicitar
POST [Organization URI]/api/data/v9.2/accounts HTTP/1.1
{
"Name": "Account name"
}
Respuesta
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>"
}
}
Causa
Este error se produce porque se usó el nombre incorrecto de una propiedad. Los nombres de propiedad distinguen mayúsculas de minúsculas y Name
se usaron en lugar de name
.
Cómo evitar
Compruebe que el nombre de propiedad que usa existe en el documento de $metadata CSDL. Para obtener más información, consulte Propiedades de api web.
Error identificado en La carga proporcionada por el usuario para la entidad '{nombre de entidad}'
Hay dos problemas independientes que pueden producirse con este error. La diferencia está en InnerException.
- InnerException : Microsoft.OData.ODataException: se encontró una propiedad no declarada [...] en la carga útil.
- InnerException: System.ArgumentException: Stream no se puede leer.
InnerException : Microsoft.OData.ODataException: Se encontró una propiedad no declarada [...] en la carga útil.
Este error se produce cuando se envía un nombre de propiedad de navegación no válido con una solicitud.
Síntomas
Solicitar
POST [Organization URI]/api/data/v9.0/contacts HTTP/1.1
{
"firstname":"test",
"lastname":"contact",
"parentcustomerid@odata.bind": "accounts(a779956b-d748-ed11-bb44-6045bd01152a)"
}
Respuesta
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>".
}
}
Causa
Este error se produce porque no hay ninguna propiedad de navegación con un solo valor en el tipo de entidad de contacto denominado parentcustomerid
. Para obtener más información, consulte Contact EntityType Single-valued navigation properties(Propiedades de navegación con valores únicos de EntityType>).
parentcustomerid
es el nombre lógico de una columna de búsqueda en la tabla de contactos. Todas las búsquedas se representan mediante propiedades de navegación con un solo valor en OData. Los nombres de las propiedades de búsqueda no siempre coinciden con el nombre de la propiedad de navegación con un solo valor correspondiente.
En este caso, la parentcustomerid
columna es un tipo de búsqueda de cliente, un tipo de búsqueda de varias tablas que podría vincularse a las tablas de cuenta o de contacto. Para admitir esta búsqueda de clientes, hay dos relaciones independientes y cada una tiene una propiedad de navegación de un solo valor diferente. La propiedad de navegación con un solo valor correcto en este caso es parentcustomerid_account
.
Cómo evitar
Compruebe que el nombre de la propiedad de navegación que usa existe en el documento de $metadata CSDL. Para obtener más información, consulte Propiedades de navegación de API web, especialmente en la sección Búsquedas de varias tablas .
InnerException : System.ArgumentException: Stream no se puede leer
Este error se produce al ejecutar operaciones por lotes.
Síntomas
Aparece el siguiente error al enviar una $batch
solicitud.
Respuesta
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--
Causa
Este error de deserialización se debe al uso de finales de línea distintos de CRLF en el cuerpo de la solicitud por lotes.
En función del editor que use, estos caracteres que no son de impresión pueden ser difíciles de ver . Si usa el Bloc de notas++, puede usar la opción Mostrar todos los caracteres para que estos caracteres sean visibles.
Esta carga funcionará:
Esta carga producirá un error porque la última línea no termina con CRLF
.
En este caso, basta con agregar un retorno de carro al final de la última línea para que sea correcto.
Cómo evitar
Asegúrese de que todos los finales de línea del cuerpo de la $batch
solicitud son CRLF
. Si no puede usar , agregue dosCRLF
finales que no sean CRLF
de línea al final del cuerpo de la solicitud por lotes para resolver este error de deserialización. Para más información, consulte Solicitudes de Batch.