CRM 2013: Извикване на действия от javascript

Опитвах се да извикам действие от javascript, използвайки функцията по-долу:

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;
}

Успях успешно да предам функционални параметри и клиентски URL адрес, но това е отговорът, който получавам:

<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>

Любезно съветвам


person Mostafa Moatassem    schedule 13.12.2013    source източник


Отговори (3)


Печатна грешка!

req.setRequestHeader("SOAPAction", 
"http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationServic/Execute");

„IOrganizationServic“ се нуждае от добавено „e“.

Използвате ли SOAPLogger?

person Bvrce    schedule 04.01.2014

Опитайте се да използвате помощна рамка, която разработих - http://a33ik.blogspot.com/2013/10/custom-actions-walkthrough-for-net-and.html

person Andrew Butenko    schedule 16.12.2013

Функцията изглежда добре. Не мога да видя действителното обаждане, така че се уверете, че всички стойности са правилно кодирани, преди да изпратите заявката. MS използва следната проба, за да кодира стойностите. Лично аз бих заменил конкатенацията (низов буфер) на стойността на XmlEncode с масивен буфер, за да повиша производителността.

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;
  } 
person Adi Katz    schedule 14.12.2013
comment
Съжалявам, но не мога да разбера как да използвам вашия код, за да накарам моя код да работи правилно - person Mostafa Moatassem; 14.12.2013
comment
Моля, обяснете повече..каква е добавената стойност? Как това може да доведе до работа?? - person Mostafa Moatassem; 14.12.2013
comment
Не мога да кажа дали това е причината за проблема ви, но е очевидно, че ви липсва xml кодиране и трябва да изключите тази опция. - person Adi Katz; 14.12.2013
comment
Мисля, че има несъответствие с аргумента на името на заявката, който предавате на функцията. Каква заявка се опитвате да изпълните? Създаване ли е? ако е така, тогава requestName трябва да е равно на Create, а не на името на обекта - person Adi Katz; 14.12.2013
comment
Опитвам се да изпълня действие, така че предавам името на действието на аргумента име на заявката. - person Mostafa Moatassem; 14.12.2013
comment
Добре. Проверете дали действието е активирано и дали главните букви на името на обекта са правилни. Освен това активирайте проследяване и търсене за по-смислена информация за тази грешка. Също така бих създал друго персонализирано действие, за да видя дали това поведение е последователно. - person Adi Katz; 14.12.2013