Я создаю веб-ресурс для Dynamics CRM (8.2). Когда я пытаюсь получить данные с помощью fetchXml вот так, все в порядке:
<fetch mapping="logical" count="3" >
<entity name="product" >
<attribute name="name" />
<attribute name="productnumber" />
</entity>
</fetch>
но если я добавлю параметр 'page', как в следующем коде, я получу недопустимый XML.
<fetch mapping="logical" count="3" page="1" >
<entity name="product" >
<attribute name="name" />
<attribute name="productnumber" />
</entity>
</fetch>
Я протестировал выборку с помощью FetchXml Tester от XrmToolBox. Там нормально работает. Что я сделал не так?
Я попытался выполнить запрос с помощью пакета npm dynamic-web-api (https://www.npmjs.com/package/dynamics-web-api) и с XMLHttpRequest. Оба работали, как описано выше.
Сообщение об ошибке следующее: (извините за форматирование)
{
"error":{
"code":"",
"message":"Invalid XML.",
"innererror":{
"message":"Invalid XML.",
"type":"System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]",
"stacktrace":" at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.RetrieveMultiple(QueryBase query, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode)
at Microsoft.Crm.Extensibility.OData.CrmODataExecutionContext.RetrieveMultiple(QueryBase query)
at Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.ExecuteQueryForEntitySet(CrmODataExecutionContext context, String entitySetName, CustomQueryOptions queryOptions, String fetchXml)
at Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.RetrieveEdmEntityCollection(CrmODataExecutionContext context, String entityCollectionName, String castedEntityName, ODataQueryOptions queryOptions)
at Microsoft.Crm.Extensibility.OData.EntityController.GetEntitySet(String entitySetName)
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
}
}
**Edit**
My error were somewhere in the formatting of the fetch-string. I used:
const query = encodeURI (connectionString + "? fetchXml =" + encodeURI (xmlString));
the correct code is:
const query = encodeURI (connectionString) + «? fetchXml =» + encodeURI (xmlString);
Ty AnkUser for your example. It helped me much.