我们是一个小团队,有一个 ASP.NET Web 开发人员和一个 ColdFusion 开发人员。我们都不知道对方的环境。我使用 Visual Studio 2005 编写了一个 ASMX Web 服务,并在 Visual Studio 2008 中编写了一个成功使用 Web 服务的 Web 应用程序项目。但是现在我们正试图让我的 ColdFusion 同事使用 Web 服务,并且我们得到了我们无法解释的结果(除了推测目标 Web 服务甚至没有被达到,但是 ColdFusion 使用的某些“系统层”正在失败。
编辑 - 更新:2009 年 6 月 2 日:
CF 开发人员看到的错误消息的最重要部分:
"Could not generate stub objects for web service invocation"
这是 CF 客户端看到的堆栈跟踪:
org.xml.sax.SAXException: Fatal Error: URI=null Line=11: The element type "META" must be terminated by the matching end-tag "</META>".
at org.apache.axis.utils.XMLUtils$ParserErrorHandler.fatalError(XMLUtils.java:723)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:369)
at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:388)
at coldfusion.xml.rpc.XmlRpcServiceImpl.retrieveWSDL(XmlRpcServiceImpl.java:647)
at coldfusion.xml.rpc.XmlRpcServiceImpl.access$000(XmlRpcServiceImpl.java:51)
at coldfusion.xml.rpc.XmlRpcServiceImpl$1.run(XmlRpcServiceImpl.java:208)
at java.security.AccessController.doPrivileged(Native Method)
at coldfusion.xml.rpc.XmlRpcServiceImpl.registerWebService(XmlRpcServiceImpl.java:201)
at coldfusion.xml.rpc.XmlRpcServiceImpl.getWebService(XmlRpcServiceImpl.java:475)
at coldfusion.xml.rpc.XmlRpcServiceImpl.getWebServiceProxy(XmlRpcServiceImpl.java:430)
at coldfusion.tagext.lang.InvokeTag.doEndTag(InvokeTag.java:381)
at cfuploadfileSimple2ecfm1056043715.runPage(D:\AMTSTEST\webservice\uploadfileSimple.cfm:68)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:152)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:349)
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:225)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:69)
at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:52)
at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:115)
at coldfusion.CfmServlet.service(CfmServlet.java:107)
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:78)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:91)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:257)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:541)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:204)
at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:318)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:426)
at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:264)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
这是我们试图调用的 webmethod 的签名:
[WebMethod]
public string UploadFileBasic(string trimURL
, byte[] incomingArray
, string FileName
, string TrimRecordTypeName)
我们对如何进行感到很困惑。明天我可以发布 CF 源代码,如果有用的话,但据我所知,它非常简单,并且在我们的单元测试中,服务的 CF 调用中的大多数参数都是常量(字符串)。
任何适当的 CF 论坛的帮助或建议将不胜感激。谢谢。
编辑更新 2009 年 6 月 2 日:
这是 CFML 代码:
<!--- read test.txt file into a binary variable --->
<cffile action="readBinary" file="#FileName#" variable="objBinaryData">
<!--- convert the binary variable to Base64 --->
<cfset b64file = #toBase64(objBinaryData)#>
<!--- invoke .net web service --->
<cfinvoke webservice = "http://trim/trimbroker/fileservice.asmx?wsdl"
method = "UploadFileBasic"
returnVariable = "recordNumber">
<cfinvokeargument name="trimURL" value="trim/trimWSdev/trim.asmx" />
<cfinvokeargument name="incomingArray" value="#b64file#" />
<cfinvokeargument name="FileName" value="#form.FILENAME#" />
<cfinvokeargument name="TrimRecordTypeName" value="Document" />
</cfinvoke>
请注意,我们已经大大简化了这一点,试图让事情正常进行。上面的参数 1 和 4 只是字符串常量。参数 2 是我们对 .Net 期望的字节数组的尝试。我们相信我们不会被 .Net 网络服务拒绝;相反,从堆栈跟踪中可以看出,在消息甚至通过网络发送之前,它就陷入了 SAX 异常。.Net Web 服务不会将任何内容记录到运行它的服务器的应用程序日志或系统日志中。
ColdFusion 版本是:ColdFusion MX 7。
编辑 - 2009 年 6 月 4 日:
通过另一个更专业的论坛解决了这个问题:
http://forums.adobe.com/message/2009491#2009491
简而言之,当在 IIS 中使用“集成 Windows 身份验证”配置目标 Web 服务(我们的就是这样并且需要)时,CF MX 7 惨遭失败(错误消息没有给出任何线索)。更多的研究导致了这一点:
http://blog.tagworldwide.com/?p=16
我们仍在追求这一点,并试图找到一个完全可行的解决方案。最重要的是,ColdFusion“管理员”必须进行一些“特殊配置”以使“生成的 Java 存根”能够连接到需要 Windows 身份验证的 .Net Web 服务。