1

我使用 FlashBuilder 工具创建了 Zend AMF 服务。我想尝试的是更改其中一种自动创建的方法以引发异常以查看行为。它没有将异常序列化回我的 Flex 应用程序,而是为我提供了以下信息:

[RPC 故障 faultString="Channel disconnected" faultCode="Client.Error.DeliveryInDoubt" faultDetail="Channel 在收到确认之前已断开"] 在 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] 在 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() 在 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] 在 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.如:445]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] 在 mx.messaging.channels::AMFChannel/statusHandler()[E:\dev\4.0.0\frameworks\projects\rpc \src\mx\messaging\channels\AMFChannel.as:445]

频道断线...

[RPC 故障 faultString="Channel disconnected" faultCode="Client.Error.DeliveryInDoubt" faultDetail="Channel 在收到确认之前已断开"]

这是代码:

公共函数 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 Amf 只是一个将响应类型转换为 AMF 格式的序列化协议。不会发回错误消息,因为它们通常包含敏感的安全信息。大多数其他 PHP amf 序列化不能以这种方式工作。如果您有异常,您需要捕获它并将其转换为标准支持响应类型。同样在您的任何代码中,每个 Try 都需要一个 Catch,因为它不是控制结构,即使 PHP 允许您摆脱它。

如果您已将端点配置为非生产,只需要它进行调试。

require_once 'Zend/Amf/Exception.php'; throw new Zend_Amf_Exception('你想要的错误信息', $errorCode);

于 2011-01-16T05:21:04.567 回答
0

好吧,它确实序列化了为我们完成工作的异常消息和代码。部分但做到了。我没有注意到我在问题中复制代码的服务组件包含一个异常处理程序,该处理程序将抑制异常并断开通道。我删除了异常处理程序,让异常冒泡到 Zend,然后 Zend 将异常消息和消息代码发送到客户端。

我希望将实际异常作为 AS3 对象发送,但我能说什么。通过这种方式,我也可以序列化异常的属性。不幸的是,自定义异常也是如此。

于 2011-01-19T13:28:01.497 回答