1

FlashBuilder ツールを使用して Zend AMF サービスを作成しました。私が試したかったのは、動作を確認するために、自動的に作成されたメソッドの 1 つを例外をスローするように変更することでした。例外がシリアル化されて Flex アプリに戻される代わりに、次のようになります。

[RPC Fault faultString="Channel disconnected" faultCode="Client.Error.DeliveryInDoubt" faultDetail="Channel disconnected before a acknowledgment was received"] at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/ flex/mx/internal::faultHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:345] mx.rpc::Responder/fault()[ E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:68] at mx.rpc::AsyncRequest/fault()[E:\dev\4.0.0\frameworks\ projects\rpc\src\mx\rpc\AsyncRequest.as:113] NetConnectionMessageResponder/channelDisconnectHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as: 684] flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() mx.messaging::Channel/disconnectSuccess()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\Channel.as:1214] mx.messaging.channels::NetConnectionChannel/internalDisconnect()[E:\dev\4.0.0\frameworks\ projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:175] at mx.messaging.channels::AMFChannel/internalDisconnect()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx \messaging\channels\AMFChannel.as:355] mx.messaging.channels::AMFChannel/statusHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel. as:445]0\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel.as:355] at mx.messaging.channels::AMFChannel/statusHandler()[E:\dev\4.0.0\frameworks\projects\rpc \src\mx\messaging\channels\AMFChannel.as:445]0\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel.as:355] at mx.messaging.channels::AMFChannel/statusHandler()[E:\dev\4.0.0\frameworks\projects\rpc \src\mx\messaging\channels\AMFChannel.as:445]

チャンネルが切れる…

[RPC 障害 faultString="チャネルが切断されました" faultCode="Client.Error.DeliveryInDoubt" faultDetail="確認応答が受信される前にチャネルが切断されました"]

これはコードです:

public function getAllUser() {

$stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename");
$this->throwExceptionOnError();

mysqli_stmt_execute($stmt);
$this->throwExceptionOnError();

$rows = array();

mysqli_stmt_bind_result($stmt, $row->id, $row->user_group_id, $row->username, $row->password, $row->active, $row->activation_key, $row->timezone, $row->created_on, $row->modified_on);

while (mysqli_stmt_fetch($stmt)) {
 $row->created_on = new DateTime($row->created_on);
 $row->modified_on = new DateTime($row->modified_on);
 $rows[] = $row;
 $row = new stdClass();
 mysqli_stmt_bind_result($stmt, $row->id, $row->user_group_id, $row->username, $row->password, $row->active, $row->activation_key, $row->timezone, $row->created_on, $row->modified_on);
}

mysqli_stmt_free_result($stmt);
mysqli_close($this->connection);

$errorCode = 1;

            throw(new Exception('the error message you want', $errorCode));

return $rows;

}

throw ステートメントに注意してください。

throw(new Exception('必要なエラー メッセージ', $errorCode));

私は本当にこれを期待していませんでした。どうすればそれを機能させることができますか?

よろしくお願いします!!!

4

2 に答える 2

0

例外メッセージとコードをシリアル化して、私たちのために仕事をします。部分的ですが、それを行います。質問でコードをコピーしたサービスコンポーネントに、例外を抑制してチャネルを切断する例外ハンドラーが含まれていることに気づきませんでした。例外ハンドラーを削除して、例外が Zend にバブル アップし、Zend が例外メッセージとメッセージ コードをクライアントに送信できるようにしました。

実際の例外を AS3 オブジェクトとして送信したいのですが、どうすればよいでしょうか。このようにして、例外のプロパティもシリアル化します。残念ながら、カスタム例外についても同じことが言えます。

于 2011-01-19T13:28:01.497 に答える
0

Zend Amf は、応答タイプを AMF 形式にキャストするシリアル化プロトコルです。通常、エラー メッセージには機密性の高いセキュリティ情報が含まれているため、エラー メッセージは返されません。他のほとんどの PHP amf シリアライゼーションは、この方法では機能しません。例外がある場合は、それをキャッチして、標準のサポート レスポンス タイプに変換する必要があります。また、どのコードでも、PHP で回避できる場合でも、Try は制御構造ではないため、すべての Try に Catch が必要です。

エンドポイントを本番環境ではなく、デバッグのためにのみ必要とするように構成した場合。

require_once 'Zend/Amf/Exception.php'; throw new Zend_Amf_Exception('必要なエラー メッセージ', $errorCode);

于 2011-01-16T05:21:04.567 に答える