locked
CRM 2011 - 443 HTTP/1.1 POST /test/XRMServices/2011/Organization.svc/web 400 2 BadRequest CRMAppPool RRS feed

  • Question

  • I have 2 organizations on my dev CRM on-premises installation. One is an imported production database and the other (named Test) was created new in the dev CRM. My javascript SOAP routine works in the imported production org and fails in the other (Test) with a 401 Access Denied error (visible when I use Wireshark). The Windows httperr##.log shows the message in the Title of this post.

    Since the message seemed to suggest the problem was permissions related to the CRMAppPool, I added the runas of that app pool (NETWORK SERVICE) to the local administrators group and rebooted. The same error messages are displayed when I re-run the javascript.

    I've been puzzling over this off and on for weeks. Any ideas? If it is a permissions issue, is there a good way to find out who is being denied what permission on what resource (so I can grant appropriate permissions in the Test org)?

    Thanks!

    Here's the code. The line of code that is executed to create the XRMServices url (in both instances)

     serverUrl = document.location.protocol + "//" + document.location.host + "/" + Xrm.Page.context.getOrgUniqueName();


    //////////////////////////////////////////////////////////////////////////////////////////////////
    // With thanks, adapted from:
    // http://mileyja.blogspot.com/2011/08/close-case-using-jscript-or-net-in.html
    //////////////////////////////////////////////////////////////////////////////////////////////////
    if (typeof (SDK) == "undefined")
    { SDK = { __namespace: true }; }
    //This will establish a more unique namespace for functions in this library. This will reduce the 
    // potential for functions to be overwritten due to a duplicate name when the library is loaded.
    SDK.SAMPLES = {
        _getServerUrl: function () {
            ///<summary>
            /// Returns the URL for the SOAP endpoint using the context information available in the form
            /// or HTML Web resource.
            ///</summary>
            var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
            var serverUrl = "";
            if (typeof GetGlobalContext == "function") {
                var context = GetGlobalContext();
                serverUrl = context.getServerUrl();
            }
            else {
                if (typeof Xrm.Page.context == "object") {
                    //serverUrl = Xrm.Page.context.getServerUrl();
                    serverUrl = document.location.protocol + "//" + document.location.host + "/" + Xrm.Page.context.getOrgUniqueName();
                }
                else
                { throw new Error("Unable to access the server URL"); }
            }
            if (serverUrl.match(/\/$/)) {
                serverUrl = serverUrl.substring(0, serverUrl.length - 1);
            }
            return serverUrl + OrgServicePath;
        },
        CloseIncidentRequest: function () {
            var incidentId = Xrm.Page.data.entity.getId();
            var requestMain = ""
            requestMain += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
            requestMain += "  <s:Body>";
            requestMain += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
            requestMain += "      <request i:type=\"b:CloseIncidentRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
            requestMain += "        <a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
            requestMain += "          <a:KeyValuePairOfstringanyType>";
            requestMain += "            <c:key>IncidentResolution</c:key>";
            requestMain += "            <c:value i:type=\"a:Entity\">";
            requestMain += "              <a:Attributes>";
            requestMain += "                <a:KeyValuePairOfstringanyType>";
            requestMain += "                  <c:key>incidentid</c:key>";
            requestMain += "                  <c:value i:type=\"a:EntityReference\">";
            requestMain += "                    <a:Id>" + incidentId + "</a:Id>";
            requestMain += "                    <a:LogicalName>incident</a:LogicalName>";
            requestMain += "                    <a:Name i:nil=\"true\" />";
            requestMain += "                  </c:value>";
            requestMain += "                </a:KeyValuePairOfstringanyType>";
            requestMain += "                <a:KeyValuePairOfstringanyType>";
            requestMain += "                  <c:key>subject</c:key>";
            requestMain += "                  <c:value i:type=\"d:string\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\">Parent Case has been resolved</c:value>";
            requestMain += "                </a:KeyValuePairOfstringanyType>";
            requestMain += "              </a:Attributes>";
            requestMain += "              <a:EntityState i:nil=\"true\" />";
            requestMain += "              <a:FormattedValues />";
            requestMain += "              <a:Id>00000000-0000-0000-0000-000000000000</a:Id>";
            requestMain += "              <a:LogicalName>incidentresolution</a:LogicalName>";
            requestMain += "              <a:RelatedEntities />";
            requestMain += "            </c:value>";
            requestMain += "          </a:KeyValuePairOfstringanyType>";
            requestMain += "          <a:KeyValuePairOfstringanyType>";
            requestMain += "            <c:key>Status</c:key>";
            requestMain += "            <c:value i:type=\"a:OptionSetValue\">";
            requestMain += "              <a:Value>5</a:Value>";
            requestMain += "            </c:value>";
            requestMain += "          </a:KeyValuePairOfstringanyType>";
            requestMain += "        </a:Parameters>";
            requestMain += "        <a:RequestId i:nil=\"true\" />";
            requestMain += "        <a:RequestName>CloseIncident</a:RequestName>";
            requestMain += "      </request>";
            requestMain += "    </Execute>";
            requestMain += "  </s:Body>";
            requestMain += "</s:Envelope>";
            var req = new XMLHttpRequest();
    
    var srvURL = SDK.SAMPLES._getServerUrl();
            req.open("POST", srvURL, true)
            // Responses will return XML. It isn't possible to return JSON.
            req.setRequestHeader("Accept", "application/xml, text/xml, */*");
            req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
            req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
            var successCallback = null;
            var errorCallback = null;
            req.onreadystatechange = function () { SDK.SAMPLES.CloseIncidentResponse(req, successCallback, errorCallback); };
            req.send(requestMain);
        },
        CloseIncidentResponse: function (req, successCallback, errorCallback) {
            ///<summary>
            /// Recieves the assign response
            ///</summary>
            ///<param name="req" Type="XMLHttpRequest">
            /// The XMLHttpRequest response
            ///</param>
            ///<param name="successCallback" Type="Function">
            /// The function to perform when an successfult response is returned.
            /// For this message no data is returned so a success callback is not really necessary.
            ///</param>
            ///<param name="errorCallback" Type="Function">
            /// The function to perform when an error is returned.
            /// This function accepts a JScript error returned by the _getError function
            ///</param>
            if (req.readyState == 4) {
                if (req.status == 200) {
                    if (successCallback != null)
                    { successCallback(); }
                }
                else {
                    errorCallback(SDK.SAMPLES._getError(req.responseXML));
                }
            }
        },
        _getError: function (faultXml) {
            ///<summary>
            /// Parses the WCF fault returned in the event of an error.
            ///</summary>
            ///<param name="faultXml" Type="XML">
            /// The responseXML property of the XMLHttpRequest response.
            ///</param>
            var errorMessage = "Unknown Error (Unable to parse the fault)";
            if (typeof faultXml == "object") {
                try {
                    var bodyNode = faultXml.firstChild.firstChild;
                    //Retrieve the fault node
                    for (var i = 0; i < bodyNode.childNodes.length; i++) {
                        var node = bodyNode.childNodes[i];
                        //NOTE: This comparison does not handle the case where the XML namespace changes
                        if ("s:Fault" == node.nodeName) {
                            for (var j = 0; j < node.childNodes.length; j++) {
                                var faultStringNode = node.childNodes[j];
                                if ("faultstring" == faultStringNode.nodeName) {
                                    errorMessage = faultStringNode.text;
                                    break;
                                }
                            }
                            break;
                        }
                    }
                }
                catch (e) { };
            }
            return new Error(errorMessage);
        },
        __namespace: true
    };
    

    Monday, June 16, 2014 7:14 PM