我需要使用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响应很好,我只是看不到请求信息。如何查看请求信息?
仍然试图确定问题是否在我的最终,或他们的问题,并且需要在此时收集事实。
答案 0 :(得分: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>
其余代码可以保持不变。
答案 1 :(得分:1)
如果你在Windows上(或者有一台Windows机器)安装Fiddler并启动它。它是一个默认侦听端口8888的代理,所以在你的cfhttp调用中,添加proxyServer =“127.0.0.1”和proxyPort =“8888”并再次运行你的请求。
注意到你正在使用443端口,所以可能是SSL。您可以启用HTTPS解密工具 - &gt; Fiddler选项 - &gt; HTTPS标签 - >解密HTTPS流量。您可能还需要import the Certificate that Fiddler uses into your keystore。
现在每个请求都会显示在Fiddler中,您可以使用右侧的请求和响应检查器来查看服务器之间的确切数据(“原始”选项卡显示数据未更改)。这为我节省了很多次,现在已成为我标准工具包的一部分。
在您的特定情况下,您是否有使用CreateObject(“webservice”,“http:// ....”)的原因。我假设它在基于.Net的网络服务上表现不佳?
此外,对GetHttpRequestData()的调用显示了您对测试页面的请求,而不是您对测试Web服务的HTTP调用。不幸的是,CFHTTP不会返回任何显示其使用的完整HTTP请求详细信息的结构。我认为这将是一个非常合理的功能请求,因为目前,你将不得不使用像fiddler或wireshark这样的工具来查看发送的内容。
答案 2 :(得分:0)
dot net的简单问题是,它无法处理coldfusion创建的XML文档。要将XML返回到dot net,请转换为字符串格式(XMLvariable.Tostring)
HTTP请求的参数应为
<cfhttpparam type="Body" value="#trim(soap).ToString#" name="FileContent"/>