6
votes

Using Dynamics 365 Version 1612 (8.2.2.112) on-premises. On the Quote form, I have modified the action called by the Activate Quote to create a custom entity (Deal) record and then navigate to the newly created record. This worked perfectly fine in all browsers until 2 weeks ago. Now, it doesn't work in IE (client preferred - but does work in Chrome, Firefox and Edge) and all I get is some generic JSON error. "Invalid JSON. A token was not recognized in the JSON content."

No amount of debugging that I add seems to add any clarity. I am getting a 400 error in IE on the XMLHttpRequest at https://xxx.xxx.com/CRM/api/data/v8.2/quotes(04224AF9-DD70-E811-8123-000D3A02DFDB)/Microsoft.Dynamics.CRM.new_SubmitQuote

  • The full Response Body is pasted below.

  • The full JSON is pasted below

This is the JS that calls the action (new_SubmitQuote) to create the new Deal entity record and then navigate to that new record.

n.xxx_submitQuote=function(n){
    r.showXrmProgressIndicator("Submitting, please wait...");
     u.executeBoundAction("quotes",n,"new_SubmitQuote").then(function(n){
        t.Utility.openEntityForm("sut_deal",n.sut_dealid,null,null)}).catch(r.logError).then(function(){
            r.closeXrmProgressIndicator()
        })
    }

Any thoughts, ideas or suggestions would be greatly appreciated. I am stumped.

Thanks, Noah

JSON

{  
   "@odata.context":"https://xxx.xxx.com/CRM/api/data/v8.2/$metadata#quotes/$entity",
   "@odata.etag":"W/\"54328330\"",
   "new_spread":95903.0200,
   "new_amount10percent":310777.7900,
   "new_revenue10":777.79,
   "new_paymentcount_date":"2018-06-19T00:53:29Z",
   "_pricelevelid_value":"bfa9dc95-dbcd-e611-80d7-000d3a01f3fc",
   "exchangerate":1.0000000000,
   "totaldiscountamount":0.0000,
   "name":"100026",
   "totallineitemamount":0.0000,
   "_transactioncurrencyid_value":"9107a2c3-bab1-e611-80d2-000d3a01f3fc",
   "_owninguser_value":"a9c113ac-d532-e811-8119-000d3a02dfdb",
   "totalamount":0.0000,
   "_ownerid_value":"a9c113ac-d532-e811-8119-000d3a02dfdb",
   "versionnumber":54328330,
   "quoteid":"04224af9-dd70-e811-8123-000d3a02dfdb",
   "totallineitemdiscountamount":0.0000,
   "timezoneruleversionnumber":0,
   "totalamountlessfreight_base":0.0000,
   "statuscode":1,
   "createdon":"2018-06-15T20:52:12Z",
   "totaltax_base":0.0000,
   "totallineitemamount_base":0.0000,
   "totalamount_base":0.0000,
   "modifiedon":"2018-06-15T20:53:23Z",
   "totaltax":0.0000,
   "totaldiscountamount_base":0.0000,
   "quotenumber":"QUO-38015-F3D2B8",
   "_modifiedby_value":"a9c113ac-d532-e811-8119-000d3a02dfdb",
   "revisionnumber":0,
   "_createdby_value":"a9c113ac-d532-e811-8119-000d3a02dfdb",
   "pricingerrorcode":0,
   "totallineitemdiscountamount_base":0.0000,
   "statecode":0,
   "_owningbusinessunit_value":"1a1ad33f-bab1-e611-80d2-000d3a01f3fc",
   "willcall":false,
   "_customerid_value":"7a60bf77-dd70-e811-8123-000d3a02dfdb",
   "billto_addressid":null,
   "discountpercentage":null,
   "shipto_composite":null,
   "onholdtime":null,
   "billto_line2":null,
   "closedon":null,
   "paymenttermscode":null,
   "freightamount_base":null,
   "_modifiedonbehalfby_value":null,
   "freightamount":null,
   "billto_city":null,
   "_campaignid_value":null,
   "shipto_line1":null,
   "_contactid_value":null,
   "requestdeliveryby":null,
   "freighttermscode":null,
   "billto_stateorprovince":null,
   "effectivefrom":null,
   "shipto_line3":null,
   "discountamount_base":null,
   "billto_line3":null,
   "shipto_telephone":null,
   "shipto_contactname":null,
   "expireson":null,
   "shipto_freighttermscode":null,
   "shipto_line2":null,
   "shipto_addressid":null,
   "_opportunityid_value":null,
   "shipto_fax":null,
   "shipto_country":null,
   "shipto_stateorprovince":null,
   "billto_composite":null,
   "billto_line1":null,
   "billto_contactname":null,
   "billto_telephone":null,
   "shipto_city":null,
   "_owningteam_value":null,
   "discountamount":null,
   "description":null,
   "shippingmethodcode":null,
   "processid":null,
   "_accountid_value":null,
   "_slainvokedid_value":null,
   "stageid":null,
   "traversedpath":null,
   "billto_postalcode":null,
   "utcconversiontimezonecode":null,
   "shipto_name":null,
   "overriddencreatedon":null,
   "billto_fax":null,
   "effectiveto":null,
   "importsequencenumber":null,
   "_new_createdby_value":null,
   "shipto_postalcode":null,
   "lastonholdtime":null,
   "billto_name":null,
   "_slaid_value":null,
   "_createdonbehalfby_value":null,
   "billto_country":null,
}

ERROR

    {
    "error":{
    "code":"","message":"Invalid JSON. A token was not recognized in the JSON content.",
    "innererror":{
    "message":"Invalid JSON. A token was not recognized in the JSON content.","type":"Microsoft.Crm.CrmHttpException","stacktrace":"
    at Microsoft.Crm.Extensibility.OData.CrmODataUtilities.ValidateInputParameters(ModelStateDictionary controllerModelState)
    at Microsoft.Crm.Extensibility.OData.ActionController.PostBoundAction(String entityName, String key, String operationName, ODataUntypedActionParameters parameters)
    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

1 Answers

1
votes

Maybe because you are using JS promises which may not be supported by some versions of IE referring mozilla.org caniuse.com, however you may workaround it by trying regular action call with callback parameters for opening the entity form, check sample below, consider changing API version.

function ExecuteAction(entitySet, entityId, actionName, Parameters, successCallBack, ErrorCallBack, isAsync) {
debugger;
var clientUrl = Xrm.Page.context.getClientUrl();
var isAsync = isAsync || false;
var result = {};
entityId = entityId.replace('{', '').replace('}', '');
var req = new XMLHttpRequest();
req.open("POST", clientUrl + "/api/data/v8.1/" + entitySet + "(" + entityId + ")/Microsoft.Dynamics.CRM." + actionName, isAsync);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function () {
    if (this.readyState == 4 /* complete */) {
        req.onreadystatechange = null;
        var s = this.status;
        if (s >= 200 && s < 300) { //success 
            result.status = true;
            result.data = this.response;
            if (successCallBack) 
                successCallBack();

        } else if (s >= 400 && s < 500) { // client error 
            result.status = false;
            console.log("Client error");
            result.error = JSON.parse(this.response).error;
            console.log(result.error);
            console.log(result.error.message);
            if (ErrorCallBack)
                ErrorCallBack(result);


        } else if (s >= 500) { //server error 
            result.status = false;
            console.log("Server error");
            result.error = JSON.parse(this.response).error;
            console.log(result.error);
            console.log(result.error.message);
            if (ErrorCallBack) 
                ErrorCallBack(result);

        }

if (Parameters == "" || Parameters == null) {
    req.send();
} else {
    req.send(JSON.stringify(Parameters));
}

return result;

}