javascript - 使用 javascript 调用外部 Web 服务 CRM 2011 RU 12 (Rollup 12)

标签 javascript web-services soap dynamics-crm-2011

直到最近,我们一直在 Dynamics CRM 2011 应用程序中使用 RU 11,但最近开始了一个最终迁移到 CRM 2015 的项目。我们已经升级到 RU 12,这就是事情变得有趣的地方!

我已经设法解决了许多以前存在的编码问题,但我一生都无法解决访问外部 Web 服务、沿途传递参数和检索数据的问题。

起初,我在使用“CreateXmlHttp()”函数时遇到了麻烦,但在网上找到了一个很好的答案,表明以下函数会有所帮助:

function CreateXmlHttp()
{
    var ref = null;
    if (window.XMLHttpRequest) {
        ref = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // Older IE
        ref = new ActiveXObject("MSXML2.XMLHTTP.3.0");
    }            
    return ref;         
}

这工作正常,正如预期的那样,我现在似乎可以连接到该服务。

但是,我没有检索任何数据,这就是让我陷入困境的问题。

作为背景,以下是我的代码,用于在将 xml 发布到 Web 服务之前声明一些整数变量。

parseInt(lngLicensNr);
parseInt(lngNrOfUsers);
parseInt(lngAnnualWorkingTime);
parseInt(lngIncludedHours);
parseInt(productType);

if (licenceType == 100000000) {
    var licenseType = "ltUnlimitedMode";
    lngIncludedHours = 1000000;
}
if (licenceType == 100000001) {
    var licenseType = "ltHourlyMode";
}

if (lngLicensNr != null && lngNrOfUsers != null && lngAnnualWorkingTime != null && lngIncludedHours != null && productType != null && licenseType != null) {

    var errMsg = "";
    var errCount = 0;
    var xml = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
    xml += "<soap:Body>";
    xml += "<GetBaseInstallationKey xmlns=\"http://www.keyservice.com/\">";
    xml += "<licensNr>" + lngLicensNr + "</licensNr>";
    xml += "<nrOfUsers>" + lngNrOfUsers + "</nrOfUsers>";
    xml += "<annualWorkingTime>" + lngAnnualWorkingTime + "</annualWorkingTime>";
    xml += "<includedHours>" + lngIncludedHours + "</includedHours>";
    xml += "<productType>" + baseProduct + "</productType>";
    xml += "<licenseType>" + licenseType + "</licenseType>";
    xml += "</GetBaseInstallationKey>";
    xml += "</soap:Body>";
    xml += "</soap:Envelope>";

    try {
        Request = CreateXmlHttp();
    } catch (ex) {
        alert("An error occured while accessing the webservice.\n\n1. " + ex.name + " \n " + ex.message + "\n\n");
        errCount = 1;
    }

    if (errCount == 0) {
        try {
            Request.open("POST", "http://web01:8080/KeyWebService/KeyWebService.asmx", false);
        } catch (ex) {
            alert("An error occured while accessing the webservice.\n\n2. " + ex.name + " \n " + ex.message + "\n\n");
            errCount = 1;
        }
    }

    if (errCount == 0) {
        try {
            Request.setRequestHeader("SOAPAction", "http://www.keyservice.com/GetKey");
            Request.setRequestHeader("Host", "web01:8080");
            Request.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
            Request.setRequestHeader("Content-Length", xml.length);
            Request.send(xml);
            var xmlDoc = Request.responseXML;
        } catch (ex) {
            alert("An error occured while accessing the webservice.\n\n3. " + ex.name + " \n " + ex.message + "\n\n");
            errCount = 1;
        }
    }

    if (errCount == 0 || Request.responseXML != null) {
        baseKey = Request.responseXML.text;
    } else {
        baseKey = "No key generated";
    }
}

if (lngLicensNr == null || lngNrOfUsers == null || lngAnnualWorkingTime == null || lngIncludedHours == null || productType == null || licenseType == null) {
    alert('Not all parameters have been entered - it is not possible to generate a key without all parameters');
}

在 RU 12 之前,代码运行得非常好,并且最后一个变量“baseKey”是从 Web 服务中检索到的。

但是,整个过程现在工作得很好,因为它似乎连接正常,但只是没有从服务中检索“baseKey”。

我认为该问题可能与已弃用的端点或架构有关,甚至与返回并显示值的已弃用代码(即 var xmlDoc = Request.responseXML;)有关,但我不确定在哪里解决。

如果有人有任何想法或可以为我指明正确的方向,那将是一个很大的帮助。

最佳答案

我们有类似的要求,需要调用外部Web服务来检索联系人的最新契约(Contract)并将其显示在联系表单上。

我们有自己的最新合约定义,并在网络服务中实现。因此,我必须在 Contact Form Load 上调用该 Web 服务并提取数据。我找不到答案。所以我发布了我的解决方法。

我编写了一个在检索联系人时执行的插件。我从插件中调用了 Webservice 并更新了联系人字段。

var javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.MaxJsonLength = 104857600; //200 MB unicode

StringBuilder URI = new StringBuilder();
URI.Append(crmRestWebServiceUrl).Append(webServiceMethod);
var request = (HttpWebRequest)WebRequest.Create(URI.ToString());
request.Method = "POST";
request.Accept = "application/json";
request.ContentType = "application/json; charset=utf-8";

//Serialize request object as JSON and write to request body
  if (latestMembershipRequest != null)
   {
     var stringBuilder = new StringBuilder();
     javaScriptSerializer.Serialize(latestMembershipRequest, stringBuilder);
     var requestBody = stringBuilder.ToString();
     request.ContentLength = requestBody.Length;
  var streamWriter = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
 streamWriter.Write(requestBody);
 streamWriter.Close();   
   }


  var response = request.GetResponse();

 //Read JSON response stream and deserialize
var streamReader = new System.IO.StreamReader(response.GetResponseStream());
var responseContent = streamReader.ReadToEnd().Trim();
LatestMembershipResponse latestMembershipResponse = javaScriptSerializer.Deserialize<LatestMembershipResponse>(responseContent);

  ContactToUpdate["gr_membershiptitle"] = latestMembership.MembershipTitle;
  ContactToUpdate["gr_membershipstartdate"] = Convert.ToDateTime(latestMembership.MembershipStartDate);
  ContactToUpdate["gr_membershipenddate"] = Convert.ToDateTime(latestMembership.MembershipEndDate);
  ContactToUpdate["gr_membershipstatus"] = latestMembership.MembershipStatus;
  service.Update(ContactToUpdate);

关于javascript - 使用 javascript 调用外部 Web 服务 CRM 2011 RU 12 (Rollup 12),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29815232/

相关文章:

javascript - 如何从 Qt 调用 evaluateJavaScript() 函数?

javascript - 如何调用变量名而不是其值?

asp.net - 设置 POST Web API 方法?

Java 使用 Web 服务

java - Spring 启动 : Use specific alias form keystore to consume HTTPS SOAP webservice

ios - 在 Objective-C 中调用 Magento SOAP API 时出错

javascript - Jquery onclick事件图标颜色没有改变

iphone - 所有输出结果都有效,但 TableView 未从 iPhone 中的 Web 服务加载数据

java - 如何为 SOAP 请求中的子元素设置 Type 属性?

javascript - 单击的列表项的索引不会重置