【问题标题】:CRM 2013: Calling actions from javascriptCRM 2013:从 javascript 调用操作
【发布时间】:2013-12-13 23:24:31
【问题描述】:

我试图使用以下函数从 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>

请多多指教

【问题讨论】:

    标签: dynamics-crm-2011 dynamics-crm crm


    【解决方案1】:

    错别字!

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

    “IOrganizationServic”需要附加一个“e”。

    您在使用 SOAPLogger 吗?

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        功能看起来不错。我看不到实际调用,因此请确保在发送请求之前对所有值进行正确编码。 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;
          } 
        

        【讨论】:

        • 很抱歉,我无法理解如何使用您的代码让我的代码正常运行
        • 请解释更多..附加值是什么?这如何导致它发挥作用??
        • 不能说这是否是导致您的问题的原因,但很明显您缺少 xml 编码,您需要排除此选项。
        • 我认为您传递给函数的请求名称参数不匹配。您要执行什么请求?是“创造”吗?如果是这样,那么 requestName 应该等于“创建”而不是实体名称
        • 我正在尝试执行一个动作,所以我将动作名称传递给 requestname 参数。
        猜你喜欢
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 2013-03-31
        • 2014-11-03
        • 1970-01-01
        相关资源
        最近更新 更多