1

我需要使用 ColdFusion 8 使用 asp.net Web 服务并返回一个 XML 文件。

我能够与 asp.net 服务通信,但从服务返回一个错误,基本上说我传递的信息无效。

这是我的代码的运行:

<cfxml variable="soap">
<?xml version="1.0" encoding="UTF-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <soap:Body>
<cfoutput> <GetSession xmlns="#stagingurl#"></cfoutput>  
  <strApplicationKey>myappkey</strApplicationKey>
  <UID>myuserid</UID>
  <arrProperties>
    <Property>
      <Name>IP</Name>
      <Value>127.0.0.1</Value>
    </Property>
  </arrProperties>
  <arrRoles />
</GetSession>
</soap:Body>
</soap:Envelope>         
</cfxml>

<cfhttp url="#apiurl#" method="post" result="httpresponse" port="443">

  <cfhttpparam type="header" name="content-type" value="text/xml"> 
  <cfhttpparam type="header" name="SOAPAction" value="#mysoapaction#"> 
  <cfhttpparam type="header" name="content-length" value="#len(trim(soap))#"> 
  <cfhttpparam type="header" name="charset" value="utf-8">
  <cfhttpparam type="Body" value="#trim(soap)#" name="FileContent"/>  

</cfhttp>

<cfdump var="#GetHttpRequestData()#" label="Get Http Request Data" />

有没有办法预览正在发送的信息以确保 ColdFusion 实际上正在发送我的 XML/SOAP 请求?

我确实使用#GetHttpRequestData()#过返回一些数据,并且在结构中,内容是“空字符串”,这就是我需要帮助的地方。这应该是空的吗?这对我来说是新的,但是,我想我希望传递给 asp.net 服务的信息会在那里。

仅供参考 - 我可以很好地看到 HTTP 和 SOAP 响应,我只是看不到请求信息。如何查看请求信息?

仍在尝试确定问题是我的问题还是他们的问题,此时需要收集事实。

4

3 回答 3

2

使用 Web 服务时另一个非常宝贵的工具是soapUI。这绝对应该是你工具包的一部分。您可以使用soapUI 构建您的请求并检查响应。一旦你让它与soapUI一起工作,你就可以将你的请求复制到你的ColdFusion代码中。

我注意到的一件事是您将 XML 包装在cfxml标签中。我不确定这是否会影响您的请求。我通常将我的 XML 请求包装在cfsavecontent标签中。因此,您可以尝试像这样更改代码:

<cfsavecontent variable="soap">
<?xml version="1.0" encoding="UTF-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
   <cfoutput> <GetSession xmlns="#stagingurl#"></cfoutput>  
   <strApplicationKey>myappkey</strApplicationKey>
   <UID>myuserid</UID>
   <arrProperties>
     <Property>
       <Name>IP</Name>
       <Value>127.0.0.1</Value>
     </Property>
   </arrProperties>
   <arrRoles />
   </GetSession>
   </soap:Body>
</soap:Envelope>         
</cfsavecontent>

您的其余代码可以保持不变。

于 2012-09-14T13:07:14.623 回答
1

如果您在 Windows 上(或手头有 Windows 机器)安装Fiddler并启动它。它是一个默认侦听端口 8888 的代理,因此在您的 cfhttp 调用中,添加 proxyServer="127.0.0.1" 和 proxyPort="8888" 并再次运行您的请求。

刚刚注意到您使用的是端口 443,所以可能是 SSL。您可以启用 HTTPS 解密工具->Fiddler 选项->HTTPS 选项卡->解密 HTTPS 流量。然后,您可能还需要将Fiddler 使用的证书导入您的密钥库

现在每个请求都将显示在 Fiddler 中,您可以使用右侧的请求和响应检查器查看服务器之间传输的确切数据(原始选项卡显示数据未更改)。这救了我很多次,现在是我标准工具包的一部分。

在您的特定情况下,您是否有理由不使用 CreateObject("webservice","http://....") 。我假设它不能很好地与基于 .Net 的网络服务一起使用?

此外,对 GetHttpRequestData() 的调用显示了您对测试页面发出的请求,而不是您对测试 Web 服务发出的 HTTP 调用。不幸的是,CFHTTP 不返回任何显示其使用的完整 HTTP 请求详细信息的结构。我认为这将是一个非常合理的功能请求,因为目前,您必须使用 fiddler 或 wireshark 之类的工具来查看发送的内容。

于 2012-09-14T08:30:54.400 回答
0

Simple issue with dot net is, it cannot processs XML document created by coldfusion. To return XML to dot net, convert into string format (XMLvariable.Tostring)

param of HTTP request should be
<cfhttpparam type="Body" value="#trim(soap).ToString#" name="FileContent"/>

于 2014-07-25T11:04:30.803 回答