Reputation: 351
I was trying to call action from javascript using the below function:
function ExecuteActionCreateProject(reason, entityId, entityName, requestName)
{
// Creating the request XML for calling the Action
var requestXML = ""
requestXML += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
requestXML += " <s:Body>";
requestXML += " <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
requestXML += " <request xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
requestXML += " <a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
requestXML += " <a:KeyValuePairOfstringanyType>";
requestXML += " <b:key>Reason</b:key>";
requestXML += " <b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">"+reason+"</b:value>";
requestXML += " </a:KeyValuePairOfstringanyType>";
requestXML += " <a:KeyValuePairOfstringanyType>";
requestXML += " <b:key>Target</b:key>";
requestXML += " <b:value i:type=\"a:EntityReference\">";
requestXML += " <a:Id>"+entityId+"</a:Id>";
requestXML += " <a:LogicalName>"+entityName+"</a:LogicalName>";
requestXML += " <a:Name i:nil=\"true\" />";
requestXML += " </b:value>";
requestXML += " </a:KeyValuePairOfstringanyType>";
requestXML += " </a:Parameters>";
requestXML += " <a:RequestId i:nil=\"true\" />";
requestXML += " <a:RequestName>"+requestName+"</a:RequestName>";
requestXML += " </request>";
requestXML += " </Execute>";
requestXML += " </s:Body>";
requestXML += "</s:Envelope>";
var req = new XMLHttpRequest();
req.open("POST", GetClientUrl(), false)
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/IOrganizationServic/Execute");
req.send(requestXML);
//Get the Resonse from the CRM Execute method
var response = req.responseXML.xml;
}
I was able to pass function parameters and client URL successfully, however this is the response this I get:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode>
<faultstring xml:lang="en-US">The message with Action 'http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationServic/Execute' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
</faultstring>
</s:Fault>
</s:Body>
</s:Envelope>
Kindly advise
Upvotes: 2
Views: 7885
Reputation: 2170
Typo!
req.setRequestHeader("SOAPAction",
"http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationServic/Execute");
"IOrganizationServic" needs an 'e' appended.
Are you using the SOAPLogger?
Upvotes: 8
Reputation: 5446
Try to use a helper framework I've developed - http://a33ik.blogspot.com/2013/10/custom-actions-walkthrough-for-net-and.html
Upvotes: 1
Reputation: 548
The function looks ok. I can’t see the actual call so ensure that all values are properly encoded before you send the request. MS uses the following sample to encode the values. Personally, I would replace the concatenation (string buffer) of the XmlEncode value with an array buffer to boost the performance.
function loadAction() {
var reason = XmlEncode("custom string");
var entityId = XmlEncode(Xrm.Page.data.entity.getId());
var entityName = "serviceappointment";
var requestName = "new_entityname";
//call function with encoded values ...
ExecuteActionCreateProject(reason, entityId, entityName, requestName);
}
XmlEncode = function (strInput) {
var c, XmlEncode = '';
if (strInput == null) { return null; }
if (strInput == '') { return ''; }
for (var cnt = 0; cnt < strInput.length; cnt++) {
c = strInput.charCodeAt(cnt);
if (((c > 96) && (c < 123)) ||
((c > 64) && (c < 91)) ||
(c == 32) ||
((c > 47) && (c < 58)) ||
(c == 46) ||
(c == 44) ||
(c == 45) ||
(c == 95)) {
XmlEncode = XmlEncode + String.fromCharCode(c);
}
else {
XmlEncode = XmlEncode + '&#' + c + ';';
}
}
return XmlEncode;
}
Upvotes: 0