从Coldfusion调用C#WebService,我无法获得结果

时间:2015-04-15 18:00:35

标签: c# wcf coldfusion

我有一个ColdFusion(9)函数调用自托管的WCF C#WebService。我将它发布到我的虚拟服务器,并从SoapUI调用它,它可以工作。

当我使用CFInvoke从ColdFusion中调用它时,我得到一个带有方法列表的红色框。

<cfinvoke 
    webservice="http://dev-wcf/sideswebservice/SidesSelfHost.SidesWebService.svc?Wsdl"      
    method = "GetEmailsFor"
    returnVariable = "httpResponse"
   >
</cfinvoke>
<cfdump var="#httpResponse#"> 

CFDump of CFInvoke result

当我使用CFHTTP从ColdFusion调用它时,我得到了带结构名称的xml,但是没有数据。

<cfhttp 
    url="http://dev-wcf/sideswebservice/SidesSelfHost.SidesWebService.svc?Wsdl"
    resolveurl="yes"
    method="GET"
    throwOnError="yes" 
>
</cfhttp>
<cfdump var="#cfhttp#">

CFDump of CFHTTP Result

我不禁想到我在CF中收到回复的方式可能与没有获取我的电子邮件记录数据有关,因为它在肥皂用户界面中有效。

更新1:

啊,我看到隧道尽头有一盏灯。当我尝试转储getEaaempBin()时,它会崩溃并烧毁。

<cfset httpResponse = structNew()> 
<cfinvoke 
   webservice="dev-wcf/sideswebservice/…"; 
   method="GetEmailsFor" 
   returnVariable = "httpResponse"> 
</cfinvoke> 
<cfset getEmailRecord = structNew()> 
<cfset getEmailRecord = httpResponse.getEmailRecord()> 
<cfdump var="#getEmailRecord#"> 
<cfset getEaaempBin = structNew()> 
<!--- <cfset getEaaempBin = getEmailRecord.getEaaempBin()> 
      <cfdump var="#getEaaempBin#"> 
-->

CFDump of getEmailRecord() Result

更新2: 这是我最新的ColdFusion代码。地址是重复的而不是真实的数据,这是2条记录。

<cfinvoke webservice="#wsdurl#" 
    method="GetEmailsFor" 
    returnVariable = "httpResponse"> 
   <cfinvokeargument name="bin" value="0000210883"/> 
   <cfinvokeargument name="population" value="0"/> 
</cfinvoke> 

<cfset getEmailRecord = httpResponse.getEmailRecord()> 
<cfdump var="#getEmailRecord[1].getEmailAddress()#"><br> 
<cfdump var="#getEmailRecord[2].getEmailAddress()#">

结果:

charlotte.d.williams@example.com
charlotte.d.williams@example.com

更新3:

结果重复是由C#代码引起的。我唯一做错的事(没有完成9个月的列表和数据表)是在循环的顶部实例化一个新记录...我在循环中添加了一个记录实例,现在它工作得很好。

public List<EmailRecord> GetEmailsFor(string bin, Int32 population){
  EmailRecord emailRecord = new EmailRecord();
  List<EmailRecord> listEmailRecords = new List<EmailRecord>();
  DataTable dt = new DataTable();

  //... populate DataTable

  foreach (DataRow row in dt.Rows){
        if (row["EAAEMP_BIN"] == DBNull.Value){
            emailRecord.EaaempBin = "";
        }
        else{
            emailRecord.EaaempBin = (string)row["EAAEMP_BIN"];
        }
        if (row["EMAIL_ADDRESS"] == DBNull.Value){
            emailRecord.EmailAddress = "";
        }
        else{
            emailRecord.EmailAddress = (string)row["EMAIL_ADDRESS"];
        }

        listEmailRecords.Add(emailRecord);
  }

  return listEmailRecords;
}

1 个答案:

答案 0 :(得分:1)

cfinvoke的结果看起来不错。 Web服务只是返回某种wrapped array。尝试转储httpResponse.getEmailRecord()。它应该包含EmailRecord个对象的数组。

  

添加添加getEmailRecord的结果...只需获取更多方法的列表。

更新:

这应该是什么。结果是表示电子邮件记录的java对象数组。您需要遍历该数组并在每个对象上调用适当的方法来检索值。方法名称应遵循bean模式。即获取 SomePropertyName()。最后一张图片有点模糊,因此方法名称可能已关闭,但您明白了......

 for ( record in httpResponse.getEmailRecord() )
 {
     // call one of the methods to retrieve 
     //  the value for the given property
     writeDump( record.getVerificationText() );
 }
  

当我使用CFHTTP从ColdFusion调用它时,我得到了带结构的xml   名称,但没有数据

旁注,原因是你的cfhttp调用只检索定义文件,即WSDL。它不会调用返回数据的方法。