Ошибка веб-службы Coldfusion: «Невозможно проанализировать WSDL как документ XML». - PullRequest
1 голос
/ 28 июня 2010

Я пытаюсь получить веб-сервис под управлением CF9 IIS7

testpage.cfm

<cfinvoke webservice ="https://nww.eastwickpark.nhs.uk/cfcs/test.cfc?wsdl"
  method ="echoString"
  input = "hello" 
  returnVariable="foo">

<cfoutput>#foo#</cfoutput>

test.cfc

<cfcomponent output="false" access="public"  returntype="string">
  <cffunction 
      name = "echoString" 
      returnType = "string" 
      output = "no" 
      access = "remote">
    <cfargument name = "input" type = "string">
    <cfreturn #arguments.input#>
  </cffunction>
</cfcomponent>

Сообщение об ошибке

 Unable to parse WSDL as an XML document.
Parsing error: Fatal Error: URI=null Line=83: The element type "img" must be terminated by the matching end-tag "".
It is recommended that you use a web browser to retrieve and examine the requested WSDL document to ensure it is correct.

The error occurred in C:\inetpub\wwwroot\cf\testpage.cfm: line 4

2 : <cfinvoke webservice ="https://nww.eastwickpark.nhs.uk/cfcs/test.cfc?wsdl"
3 :   method ="echoString"
4 :   input = "hello" 
5 :   returnVariable="foo">
6 : 

Я могу перейти к https://nww.eastwickpark.nhs.uk/cfcs/test.cfc в браузере и получить страницу с информацией о компоненте. OK.

Если я открою http://nww.eaastwickpark.nhs.uk/cfcs/test.cfc?wdsl, я получу

<wsdl:definitions targetNamespace="http://cfcs" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://cfcs" xmlns:intf="http://cfcs" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://rpc.xml.coldfusion" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by ColdFusion version 9,0,0,251028-->
 <wsdl:types>
  <schema targetNamespace="http://rpc.xml.coldfusion" xmlns="http://www.w3.org/2001/XMLSchema">
   <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
   <complexType name="CFCInvocationException">
    <sequence/>
   </complexType>
  </schema>
 </wsdl:types>

   <wsdl:message name="CFCInvocationException">

      <wsdl:part name="fault" type="tns1:CFCInvocationException"/>

   </wsdl:message>

   <wsdl:message name="echoStringRequest">

      <wsdl:part name="input" type="xsd:string"/>

   </wsdl:message>

   <wsdl:message name="echoStringResponse">

      <wsdl:part name="echoStringReturn" type="xsd:string"/>

   </wsdl:message>

   <wsdl:portType name="Test">

      <wsdl:operation name="echoString" parameterOrder="input">

         <wsdl:input message="impl:echoStringRequest" name="echoStringRequest"/>

         <wsdl:output message="impl:echoStringResponse" name="echoStringResponse"/>

         <wsdl:fault message="impl:CFCInvocationException" name="CFCInvocationException"/>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="test.cfcSoapBinding" type="impl:Test">

      <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="echoString">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="echoStringRequest">

            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://cfcs" use="encoded"/>

         </wsdl:input>

         <wsdl:output name="echoStringResponse">

            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://cfcs" use="encoded"/>

         </wsdl:output>

         <wsdl:fault name="CFCInvocationException">

            <wsdlsoap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" name="CFCInvocationException" namespace="http://cfcs" use="encoded"/>

         </wsdl:fault>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="TestService">

      <wsdl:port binding="impl:test.cfcSoapBinding" name="test.cfc">

         <wsdlsoap:address location="https://nww.eastwickpark.nhs.uk/cfcs/test.cfc"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>

Реальный путь к cfc - это C: \ inetpub \ wwwroot \ cf \ cfcs \ test.cfc, т. Е. Не непосредственно под веб-корнем, поэтому у меня было отображение как

логический путь / cfcs
путь к каталогу C: \ inetpub \ wwwroot \ cf \ cfcs

Я не понимаю ...

Обновляется, становится ближе, если я удаляю свой метод onRequestStart из приложения.cfc работает нормально.

<cffunction name="onRequestStart" output="false" returnType="void">

    <cfinvoke component="cfcs.security" method="getControlData" returnvariable="controlData">
        <cfinvokeargument name="dsn" value="#application.dsn#">
    </cfinvoke>
    <!--- if site has been closed force a logout and direct to siteclosed notice--->
    <cfif #controlData.siteOpen# is false>
        <CFSET structDelete(session, 'auth')>
        <cflocation url='siteclosed.cfm' addtoken='No'>
        <cfabort>
    </cfif>
    <!--- If user is not logged in, force them to do so now ---> 
    <cfif not isDefined("session.auth.isLoggedIn")> 
        <!--- Check if page is excluded from authentication --->
        <cfinvoke component="cfcs.security" method="checkIfUnathenticatedPage" returnvariable="pageUnauthenticated">
            <cfinvokeargument name="dsn" value="#application.dsn#">
        </cfinvoke>
        <cfif pageUnauthenticated is 1>
            <cfset currentPage="#listlast(CGI.script_name,"/")#">
            <cfinclude template='#currentPage#'>
            <cfabort>
        <cfelse>
            <!--- page is not excluded from authentication --->             
            <!--- If the user is now submitting "loginForm" form, --->
            <!--- Include "Login Check" code to validate user --->
            <cfif isDefined("form.username")> 
                <cfinclude template="loginCheck.cfm">
            </cfif>
            <cfinclude template="loginForm.cfm">
            <cfabort>
        </cfif>
    </cfif> 

</cffunction> 

В форме входа есть изображение, где может быть загадочный тег img.

Ответы [ 3 ]

3 голосов
/ 28 июня 2010

Вы пытались сделать это, просто используя HTTP? Я вижу, что вы используете сочетание HTTP и HTTPS, так что, возможно, там есть проблема.

Также вашему тегу cfcomponent не нужны атрибуты access и returntype - они предназначены только для тега cffunction. Не уверен, что это тебя все портит.

EDIT:

Проблема Я думаю в том, что ваша onRequestStart() на самом деле включает в себя страницу входа, если они не вошли, верно? Вы не хотите, чтобы ваши запросы веб-службы.

Вы можете написать подкаталог CFC, который extends более высокий уровень CFC, и код, который не следует использовать onRequestStart(). Подробнее об этом здесь .

0 голосов
/ 10 февраля 2012

Пустой Application.cfc в этом сабе будет работать для чисто публичных cfcs.Но я обычно берусь за это по-другому, если это не широко открытый cfc (публичный, все время).И даже если это так, вы все равно можете справиться с этим стилем АОП.

Если вы хотите применить согласованную аспектно-ориентированную безопасность в методе onRequestStart, я обычно делаю что-то вроде этого (упрощенно, например, здесь):

function onRequestStart(sRequestedObject) {
  if(sRequestedObject does not contain '.cfc') { // Always suppress output in a cfc
    checkRegularLoginSecurity(sRequestedObject); // This can allow to pass, redirect, etc.
  } else {
    return checkCFCSpecificSecurity(sRequestedObject) // returns true or false 
    // false will effectively kill the request, true will go to the next event
  }
}

Таким образом, у меня может быть какой-то видметода безопасности проверяет CFC иначе, чем просто перенаправляет на страницу входа в систему (может быть, он ищет блок IP или токен значения URL, или, если он видит, что cfc 'public' в моей сетке securityObjects, он просто позволяет продолжить. В противном случаеон может правильно выполнять необходимые действия. Существует также onCFCRequest (), который может обрабатывать базовую безопасность AOP специально для запросов cfc.

0 голосов
/ 28 июня 2010

Вы пробовали обновить WSDL (либо в коде, либо через администратора)? Помните, что CF кэширует возврат WSDL. Если вы ранее сгенерировали ошибку, она все равно может быть кэширована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...