Compartir a través de


Solución de problemas de errores de cliente de Dataverse Web API

En este artículo se describen los errores comunes de cliente que puede encontrar al usar la API web de Dataverse y cómo puede evitarlos.

Recurso no encontrado para el segmento

Síntomas

Solicitud

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 de proceso personalizado está inactiva.

Cómo evitar

No se encontró una propiedad denominada '{nombre de propiedad}' en el tipo 'Microsoft.Dynamics.CRM. {nombre de entidad}'

Síntomas

Solicitud

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 de una propiedad. Los nombres de las propiedades distinguen mayúsculas de 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 la API web.

No se encontró ningún recurso HTTP que coincida con el URI de solicitud.

Síntomas

Solicitud

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 el método HTTP incorrecto se aplica 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 para usar. Para más información, vea:

Se encontró la propiedad {property name} no válida en la entidad 'Microsoft.Dynamics.CRM. {nombre de entidad}'

Síntomas

Solicitud

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 la 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.

Este error se produce cuando se envía un nombre de propiedad de navegación no válido con una solicitud.

Síntomas

Solicitud

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 de un solo valor en el tipo de entidad de contacto denominado parentcustomerid. Para obtener más información, vea Póngase en contacto con las propiedades de navegación de un solo valor 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 de un solo valor en OData. Los nombres de las propiedades de búsqueda no siempre coinciden con el nombre de propiedad de navegación de 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 la cuenta o a las tablas de contactos. 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 de un solo valor correcta 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 la API web, especialmente 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

Recibe 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.

Dependiendo del editor que use, estos caracteres que no son de impresión pueden ser difíciles de ver. Si usa Notepad++, puede usar la opción Mostrar todos los caracteres para que estos caracteres sean visibles.

Esta carga funcionará:

Captura de pantalla que muestra un cuerpo de solicitud por lotes con finales CRLF para todas las líneas.

Se producirá un error en esta carga porque la última línea no termina con CRLF.

Captura de pantalla que muestra un cuerpo de solicitud por lotes con CRLF ausente en la última línea.

En este caso, basta con agregar un retorno de carro al final de la última línea para que tenga éxito.

Cómo evitar

Asegúrese de que todos los finales de línea del cuerpo de la $batch solicitud sean CRLF. Si no puede usar CRLF, agregue dos finales queCRLF no sean de línea al final del cuerpo de la solicitud por lotes para resolver este error de deserialización. Para obtener más información, vea Solicitudes de Batch.

Vea también