適切なリモート設定を使用して CFC でこの単純な関数を呼び出そうとすると、次のようなエラーが表示されます。
「送信先 'ColdFusion' が存在しないか、送信先にチャネルが定義されておらず、アプリケーションでデフォルト チャネルが定義されていません。」
これはCFCですが、問題が存在しないことは 99% 確信していますが、非常に単純です。
<cfcomponent output="false">
<!--- Get Server Time --->
<cffunction name="getServerTime" access="remote" returnType="string">
<cfreturn now() />
</cffunction>
<cffunction name="getString" access="remote" returnType="string">
<cfreturn "hello......" />
</cffunction>
</cfcomponent>
これは、リモート呼び出しを含むmain.mxmlファイルです。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="srcview/index.html" applicationComplete="init()">
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
public function init():void{
Alert.show(conn.getString());
}
public function eventResultHandler(event:ResultEvent):void{
lblStringResult.text = event.result as String;
}
]]>
</mx:Script>
<mx:RemoteObject id="conn" destination="ColdFusion" source="DemoCFC"
result="eventResultHandler(event)" showBusyCursor="true" >
</mx:RemoteObject>
<mx:Label id="lblStringResult" y="10" horizontalCenter="0"/>
<mx:Button label="Server Time?.." click="conn.getServerTime();" y="36" horizontalCenter="0" />
</mx:Application>
これは、 WEB-INF\flex フォルダーのルートにあるservices-services.xmlファイルです。この長くて退屈なファイルで申し訳ありませんが、問題はファイルにある可能性があると思います。
<services>
<service-include file-path="remoting-config.xml" />
<service-include file-path="proxy-config.xml" />
<service-include file-path="messaging-config.xml" />
</services>
<security>
<login-command class="flex.messaging.security.JRunLoginCommand" server="JRun"/>
</security>
<channels>
<!-- CF Based Endpoints -->
<!-- {server.name}:{server.port}{context.root} -->
<channel-definition id="my-cfamf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://{server.name}:{server.port}{context.root}/flex2gateway/" class="coldfusion.flash.messaging.CFAMFEndPoint"/>
<properties>
<polling-enabled>false</polling-enabled>
<serialization>
<enable-small-messages>false</enable-small-messages>
</serialization>
<coldfusion>
<!-- define the resolution rules and access level of the cfc being invoked -->
<access>
<!-- Use the ColdFusion mappings to find CFCs-->
<use-mappings>true</use-mappings>
<!-- allow "public and remote" or just "remote" methods to be invoked -->
<method-access-level>remote</method-access-level>
</access>
<use-accessors>true</use-accessors>
<use-structs>false</use-structs>
<serialize-array-to-arraycollection>false
</serialize-array-to-arraycollection>
<proxy-load-method>loadProxy</proxy-load-method>
<property-case>
<!-- cfc property names -->
<force-cfc-lowercase>false</force-cfc-lowercase>
<!-- Query column names -->
<force-query-lowercase>false</force-query-lowercase>
<!-- struct keys -->
<force-struct-lowercase>false</force-struct-lowercase>
</property-case>
</coldfusion>
</properties>
</channel-definition>
<channel-definition id="cf-polling-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://{server.name}:{server.port}{context.root}/flex2gateway/cfamfpolling" class="coldfusion.flash.messaging.CFAMFEndPoint"/>
<properties>
<polling-enabled>true</polling-enabled>
<polling-interval-seconds>8</polling-interval-seconds>
<serialization>
<enable-small-messages>false</enable-small-messages>
</serialization>
<coldfusion>
<!-- define the resolution rules and access level of the cfc being invoked -->
<access>
<!-- Use the ColdFusion mappings to find CFCs-->
<use-mappings>true</use-mappings>
<!-- allow "public and remote" or just "remote" methods to be invoked -->
<method-access-level>remote</method-access-level>
</access>
<use-accessors>true</use-accessors>
<use-structs>false</use-structs>
<serialize-array-to-arraycollection>false
</serialize-array-to-arraycollection>
<proxy-load-method>loadProxy</proxy-load-method>
<property-case>
<!-- cfc property names -->
<force-cfc-lowercase>false</force-cfc-lowercase>
<!-- Query column names -->
<force-query-lowercase>false</force-query-lowercase>
<!-- struct keys -->
<force-struct-lowercase>false</force-struct-lowercase>
</property-case>
</coldfusion>
</properties>
</channel-definition>
<channel-definition id="my-cfamf-secure" class="mx.messaging.channels.SecureAMFChannel">
<endpoint uri="https://{server.name}:{server.port}{context.root}/flex2gateway/cfamfsecure" class="coldfusion.flash.messaging.SecureCFAMFEndPoint"/>
<properties>
<polling-enabled>false</polling-enabled>
<add-no-cache-headers>false</add-no-cache-headers>
<serialization>
<enable-small-messages>false</enable-small-messages>
</serialization>
<coldfusion>
<!-- define the resolution rules and access level of the cfc being invoked -->
<access>
<!-- Use the ColdFusion mappings to find CFCs-->
<use-mappings>true</use-mappings>
<!-- allow "public and remote" or just "remote" methods to be invoked -->
<method-access-level>remote</method-access-level>
</access>
<use-accessors>true</use-accessors>
<use-structs>false</use-structs>
<serialize-array-to-arraycollection>false
</serialize-array-to-arraycollection>
<proxy-load-method>loadProxy</proxy-load-method>
<property-case>
<!-- cfc property names -->
<force-cfc-lowercase>false</force-cfc-lowercase>
<!-- Query column names -->
<force-query-lowercase>false</force-query-lowercase>
<!-- struct keys -->
<force-struct-lowercase>false</force-struct-lowercase>
</property-case>
</coldfusion>
</properties>
</channel-definition>
<!-- Java Based Endpoints -->
<channel-definition id="java-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://{server.name}:{server.port}{context.root}/flex2gateway/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
<channel-definition id="java-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
<endpoint uri="https://{server.name}:{server.port}{context.root}/flex2gateway/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
</channel-definition>
<channel-definition id="java-polling-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://{server.name}:{server.port}{context.root}/flex2gateway/amfpolling" class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<polling-enabled>true</polling-enabled>
<polling-interval-seconds>8</polling-interval-seconds>
</properties>
</channel-definition>
</channels>
<logging>
<target class="flex.messaging.log.ConsoleTarget" level="Error">
<properties>
<prefix>[BlazeDS] </prefix>
<includeDate>false</includeDate>
<includeTime>false</includeTime>
<includeLevel>false</includeLevel>
<includeCategory>false</includeCategory>
</properties>
<filters>
<pattern>Endpoint.*</pattern>
<pattern>Service.*</pattern>
<pattern>Configuration</pattern>
<pattern>Message.*</pattern>
</filters>
</target>
</logging>
<system>
<manageable>false</manageable>
</system>
これはremoting-config.xmlファイルです。
<?xml version="1.0" encoding="UTF-8"?>
<adapters>
<adapter-definition id="cf-object" class="coldfusion.flash.messaging.ColdFusionAdapter" default="true"/>
<adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter"/>
</adapters>
<default-channels>
<channel ref="my-cfamf"/>
</default-channels>
<destination id="ColdFusion">
<channels>
<channel ref="my-cfamf"/>
</channels>
<properties>
<source>*</source>
</properties>
</destination>
main.mxml ファイルがコンパイルおよび実行されると、リモート オブジェクト接続を使用して getString() メソッドを呼び出す init() メソッドの呼び出しが返され、表示されます。
アラートボックスの「[object AsyncToken]」。
ボタンをクリックすると、メソッド getServerTime() が呼び出され、mxml ラベルにサーバー時刻が表示されますが、取得されるのは
を参照すると、白いページが表示されます。この問題を解決しようとして、私が遭遇したいくつかのスレッドによると、それはおそらく良いことです。
main.mxml ファイルと cfc は、プロジェクト内の同じフォルダーにあります。したがって、リモート呼び出しが cfc を見つけていることがわかります。
これは非常に単純な要求であるため、問題は ColdFusion の構成にあると確信しています。