对webservice的ColdFusion调用给出了org.xml.sax.SAXException

时间:2009-06-01 22:13:28

标签: asp.net web-services coldfusion sax

我们是一个拥有一名ASP.NET Web开发人员和一名ColdFusion开发人员的小团队。我们都不知道对方的环境。我使用Visual Studio 2005和Visual Studio 2008中的Web应用程序项目编写了一个ASMX Web服务,该项目成功使用了Web服务。但现在我们正试图让我的ColdFusion同事使用网络服务,我们得到的结果是我们无法解释的(除了猜测甚至没有达到目标网络服务,但是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)

以下是我们试图调用的web方法的签名:

[WebMethod]
    public string UploadFileBasic(string trimURL
        , byte[] incomingArray
        , string FileName
        , string TrimRecordTypeName)

我们对如何继续感到困惑。明天我可以发布CF源代码,如果它有用但是从我看到它非常简单,并且在我们的单元测试中此时服务的CF调用中的大多数参数都是常量(字符串)。

任何有关CF论坛的帮助或建议都将不胜感激。谢谢。

EDIT-update 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服务。

3 个答案:

答案 0 :(得分:3)

  

元素类型“META”必须是   由匹配的结束标记终止   “< / {META {1}}”。

该错误消息让我怀疑ColdFusion正在尝试使用XML解析器来解析HTML文档。如果我不得不猜测,我会说它可能试图解析ASP.NET“死亡的黄色屏幕”。我怀疑来自CF的格式错误的请求导致.NET端出错,您需要检查.NET端的错误日志,以获得有关具体反对意见的线索。

编辑:通过“黄色死亡屏幕”,我只是指标准的ASP.NET错误页面,它显示错误消息和黄色背景上的堆栈跟踪。

为了回应您的更新,我可以考虑一些可能性来检查:

  1. 堆栈跟踪和您发布的第二条错误消息似乎表明在CF下载并解析WSDL以创建代理对象时,问题正在发生,早在实际调用方法之前。如果将“http://trim/trimbroker/fileservice.asmx?wsdl”粘贴到Web浏览器中,您会获得WSDL或HTML吗?也许你被重定向到登录页面或什么?如果您没有在浏览器中获得WSDL XML文档,CF也无法获得它。

  2. 您的CF代码将base-64字符串传递给需要字节数组的参数。 CF Web服务堆栈是否足够智能以将base-64字符串转换为字节数组?我会感到惊讶,但也许。你能在CF中创建字节数组吗?你不能上次使用CF,但这是很久以前的事了。您可以尝试将objBinaryData直接传递给incomingArray参数而不转换为base-64,但如果这不起作用,最简单的方法是将.NET端的incomingArray类型更改为string,并调用Convert.FromBase64String()方法。

答案 1 :(得分:0)

CFML会很方便。另外,你使用的是什么版本的CF?我知道如果您的Web服务中存在任何重载方法,则早期版本的CF会出现问题。我不知道这是否是最新版本的问题。

答案 2 :(得分:0)

我遇到了同样的问题,原因是CF服务在Local System下运行,没有访问wsdl,所以ASP.Net返回unauthorize access。

尝试使用cfhttp来获取wsdl并查看cfhttp.fileContent是什么,你可能会遇到同样的问题。