Dynamics crm Dynamics 365搜索资源可用性

Dynamics crm Dynamics 365搜索资源可用性,dynamics-crm,dynamics-365,dynamics-crm-webapi,Dynamics Crm,Dynamics 365,Dynamics Crm Webapi,我正在尝试实现如下所述的搜索资源功能: 这里有一个如何通过JavaScript实现它的示例(尽管JavaScript库可能已被弃用或不受支持),我在这里引用了这个示例: 我编写了一个.NET核心类库,它使用Dynamics 365 OData服务发布到msdyn_SearchResourceAvailability操作 我在internet上看到了一些示例,但它们都使用Dynamics 365 SDK,而不是Dynamics 365 Web API 我收到一个错误,因此提取了正在发布的JSON,

我正在尝试实现如下所述的搜索资源功能:

这里有一个如何通过JavaScript实现它的示例(尽管JavaScript库可能已被弃用或不受支持),我在这里引用了这个示例:

我编写了一个.NET核心类库,它使用Dynamics 365 OData服务发布到msdyn_SearchResourceAvailability操作

我在internet上看到了一些示例,但它们都使用Dynamics 365 SDK,而不是Dynamics 365 Web API

我收到一个错误,因此提取了正在发布的JSON,并在Postman中尝试了相同的调用,我收到了相同的错误:

{
"error": {
    "code": "0x0",
    "message": "An error occurred while validating input parameters: Microsoft.OData.ODataException: Does not support untyped value in non-open type.\r\n   at System.Web.OData.Formatter.Deserialization.DeserializationHelpers.ApplyProperty(ODataProperty property, IEdmStructuredTypeReference resourceType, Object resource, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext)\r\n   at System.Web.OData.Formatter.Deserialization.ODataResourceDeserializer.ApplyStructuralProperties(Object resource, ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)\r\n   at Microsoft.Crm.Extensibility.CrmODataEntityDeserializer.ApplyStructuralProperties(Object resource, ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)\r\n   at System.Web.OData.Formatter.Deserialization.ODataResourceDeserializer.ReadResource(ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)\r\n   at Microsoft.Crm.Extensibility.ODataV4.CrmODataActionPayloadDeserializer.ReadEntry(ODataDeserializerContext readContext, ODataParameterReader reader, IEdmOperationParameter parameter)\r\n   at Microsoft.Crm.Extensibility.ODataV4.CrmODataActionPayloadDeserializer.Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)\r\n   at System.Web.OData.Formatter.ODataMediaTypeFormatter.ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)",
    "innererror": {
        "message": "An error occurred while validating input parameters: Microsoft.OData.ODataException: Does not support untyped value in non-open type.\r\n   at System.Web.OData.Formatter.Deserialization.DeserializationHelpers.ApplyProperty(ODataProperty property, IEdmStructuredTypeReference resourceType, Object resource, ODataDeserializerProvider deserializerProvider, ODataDeserializerContext readContext)\r\n   at System.Web.OData.Formatter.Deserialization.ODataResourceDeserializer.ApplyStructuralProperties(Object resource, ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)\r\n   at Microsoft.Crm.Extensibility.CrmODataEntityDeserializer.ApplyStructuralProperties(Object resource, ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)\r\n   at System.Web.OData.Formatter.Deserialization.ODataResourceDeserializer.ReadResource(ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext)\r\n   at Microsoft.Crm.Extensibility.ODataV4.CrmODataActionPayloadDeserializer.ReadEntry(ODataDeserializerContext readContext, ODataParameterReader reader, IEdmOperationParameter parameter)\r\n   at Microsoft.Crm.Extensibility.ODataV4.CrmODataActionPayloadDeserializer.Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)\r\n   at System.Web.OData.Formatter.ODataMediaTypeFormatter.ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)",
        "type": "Microsoft.Crm.CrmHttpException",
        "stacktrace": "   at Microsoft.Crm.Extensibility.OData.CrmODataUtilities.ValidateInputParameters(ModelStateDictionary controllerModelState)\r\n   at Microsoft.Crm.Extensibility.OData.ActionController.<>c__DisplayClass9_0.<PostUnboundAction>b__0()\r\n   at Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute[TResult](ILogger logger, EventId eventId, ActivityType activityType, Func`1 func, IEnumerable`1 additionalCustomProperties)\r\n   at Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute[TResult](ILogger logger, XrmTelemetryActivityType activityType, Func`1 func)\r\n   at lambda_method(Closure , Object , Object[] )\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
    }
}
}

有人能告诉我哪里出了问题吗?

我能够从v8.7.x升级到Field service v8.8.x,并使用web api和以下负载测试CRM操作
msdyn\u SearchResourceAvailability
。我似乎没有所有的配置和数据设置,但是web api产生了良好的响应(不同于400=错误的请求..lol)

答复:

{
  "@odata.context": "https://crmdev.crm.dynamics.com/api/data/v9.1/$metadata#Microsoft.Dynamics.CRM.msdyn_SearchResourceAvailabilityResponse",
  "TimeSlots": [
    {
      "@odata.type": "#Microsoft.Dynamics.CRM.organization"
    },
    {
      "@odata.type": "#Microsoft.Dynamics.CRM.organization"
    },
    {
      "@odata.type": "#Microsoft.Dynamics.CRM.organization"
    },
    {
      "@odata.type": "#Microsoft.Dynamics.CRM.organization"
    },
    {
      "@odata.type": "#Microsoft.Dynamics.CRM.organization"
    }
  ],
  "Resources": [
    {
      "@odata.type": "#Microsoft.Dynamics.CRM.organization"
    }
  ],
  "Related": {
    "@odata.type": "#Microsoft.Dynamics.CRM.organization"
  },
  "Exceptions": {
    "@odata.type": "#Microsoft.Dynamics.CRM.organization"
  }
}

更新:

  • 此调用只需要版本、要求和设置,因此从最少的代码输入开始并增强它

  • 对错误消息进行故障排除时,Microsoft.OData.ODataException:不支持非打开类型中的非类型化值,请按以下方向进行操作-

  • 不确定此
    msdyn\u SearchResourceAvailability
    操作消息是否在web api中可用,但仅试用了
    OrganizationRequest
    SDK


  • 这是示例请求以及所需的有效负载:

    var parameters = {};
    var workorder = {};
    workorder.msdyn_workorderid = "ADE6F413-0063-EA11-A811-000D3A5A1CAC"; //Delete if creating new record 
    workorder["@odata.type"] = "Microsoft.Dynamics.CRM.msdyn_workorder";
    parameters.WorkOrder = workorder;
    parameters.RealTimeMode = true;
    parameters.Duration = 30;
    parameters.IgnoreDuration = true;
    parameters.IgnoreTravelTime = true;
    parameters.AllowOverlapping = true;
    parameters.Radius = 0;
    parameters.StartTime = new Date("3/10/2020").toISOString();
    parameters.EndTime = new Date("3/10/2020").toISOString();
    var resources1 = {};
    resources1.systemuserid = "3BD2ADED-20B2-E911-A98E-000D3A374B53"; //Delete if creating new record 
    resources1["@odata.type"] = "Microsoft.Dynamics.CRM.systemuser";
    parameters.Resources = [resources1];
    
    var req = new XMLHttpRequest();
    req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/msdyn_RetrieveResourceAvailability", true);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.onreadystatechange = function() {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 200) {
                var results = JSON.parse(this.response);
                alert("response: "+this.response)
            } else {
                alert(this.status);
            }
        }
    };
    req.send(JSON.stringify(parameters));
    

    我只是在没有任何数据的情况下用我的沙盒生成了这个请求,但是您可以尝试使用CRM REST builder来构建请求。

    部分问题在于,C#samples使用SDK,而SDK反过来使用了不推荐的2011 WCF服务,而不是当前的OData服务。就您指定的@OData.type而言,OData服务似乎更严格,因为它检查您提供的属性是否是该实体的真实属性/字段。设置资源规范的问题在于,在操作中,没有指定实体的类型。

    我使用的操作是msdyn\u SearchResourceAvailability,而不是msdyn\u RetrieveResourceAvailability。你能打电话给msdyn_SearchResourceAvailability吗?您可以共享从JSON.stringify(参数)获得的JSON吗?这似乎也是JavaScript。我正在寻找C#实现。事实上,JSON会很好。@JFK007我的错。你有没有找到sdk样本的链接,或者从哪里获得JSON的链接。我找不到关于这个话题的任何信息。我在元数据中未看到此端点此操作仅在安装Field Service时可用。我联系了我的MS联系人,等待他们的答复,
    {
      "@odata.context": "https://crmdev.crm.dynamics.com/api/data/v9.1/$metadata#Microsoft.Dynamics.CRM.msdyn_SearchResourceAvailabilityResponse",
      "TimeSlots": [
        {
          "@odata.type": "#Microsoft.Dynamics.CRM.organization"
        },
        {
          "@odata.type": "#Microsoft.Dynamics.CRM.organization"
        },
        {
          "@odata.type": "#Microsoft.Dynamics.CRM.organization"
        },
        {
          "@odata.type": "#Microsoft.Dynamics.CRM.organization"
        },
        {
          "@odata.type": "#Microsoft.Dynamics.CRM.organization"
        }
      ],
      "Resources": [
        {
          "@odata.type": "#Microsoft.Dynamics.CRM.organization"
        }
      ],
      "Related": {
        "@odata.type": "#Microsoft.Dynamics.CRM.organization"
      },
      "Exceptions": {
        "@odata.type": "#Microsoft.Dynamics.CRM.organization"
      }
    }
    
    var parameters = {};
    var workorder = {};
    workorder.msdyn_workorderid = "ADE6F413-0063-EA11-A811-000D3A5A1CAC"; //Delete if creating new record 
    workorder["@odata.type"] = "Microsoft.Dynamics.CRM.msdyn_workorder";
    parameters.WorkOrder = workorder;
    parameters.RealTimeMode = true;
    parameters.Duration = 30;
    parameters.IgnoreDuration = true;
    parameters.IgnoreTravelTime = true;
    parameters.AllowOverlapping = true;
    parameters.Radius = 0;
    parameters.StartTime = new Date("3/10/2020").toISOString();
    parameters.EndTime = new Date("3/10/2020").toISOString();
    var resources1 = {};
    resources1.systemuserid = "3BD2ADED-20B2-E911-A98E-000D3A374B53"; //Delete if creating new record 
    resources1["@odata.type"] = "Microsoft.Dynamics.CRM.systemuser";
    parameters.Resources = [resources1];
    
    var req = new XMLHttpRequest();
    req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/msdyn_RetrieveResourceAvailability", true);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.onreadystatechange = function() {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 200) {
                var results = JSON.parse(this.response);
                alert("response: "+this.response)
            } else {
                alert(this.status);
            }
        }
    };
    req.send(JSON.stringify(parameters));