FetchXml-Request не работает, если он содержит «страницу» (неверный XML) - PullRequest
0 голосов
/ 19 сентября 2019

Я создаю веб-ресурс для 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 (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()"
    }
  }
  }

1 Ответ

0 голосов
/ 19 сентября 2019

Я только что попробовал с Page=1 с моим запросом ниже и Fetchxml, и он работал нормально для меня. Примечание. Я использовал Account для моего примера, но это не должно быть проблемой.

<fetch mapping="logical" count="3" page="1" >
        <entity name="account" >
            <attribute name="name" />
            <attribute name="accountnumber" />
        </entity>

var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/accounts?fetchXml=%3Cfetch%20mapping%3D%22logical%22%20count%3D%223%22%20page%3D%221%22%20%3E%3Centity%20name%3D%22account%22%20%3E%3Cattribute%20name%3D%22name%22%20%2F%3E%3Cattribute%20name%3D%22accountnumber%22%20%2F%3E%3C%2Fentity%3E%3C%2Ffetch%3E", false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 200) {
            var results = JSON.parse(this.response);
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send();
...