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
Я пытаюсь выполнить действие, поэтому я передаю имя действия аргументу requestname. - person Mostafa Moatassem; 14.12.2013
comment
В порядке. Убедитесь, что действие активировано и что регистр имени объекта указан правильно. Кроме того, включите отслеживание и поиск более значимой информации об этой ошибке. Я бы также создал еще одно пользовательское действие, чтобы проверить, соответствует ли это поведение. - person Adi Katz; 14.12.2013