【问题标题】:Retrieving parameters of WCF request from Silverlight when a TimeoutException occurs发生 TimeoutException 时从 Silverlight 检索 WCF 请求的参数
【发布时间】:2012-06-13 07:38:03
【问题描述】:

我有一个 Silverlight 项目调用 WCF 服务。服务方法 GetData 有一个参数 dataID,通过 GetDataAsync 调用,由具有函数 BeginGetData 和 EndGetData 的自动创建的类处理。在某些情况下,调用会在 EndGetData 中引发 TimeoutException(这很好,它自己调用一些第三方服务的 WCF 服务有时可能会关闭或出现问题,所以我不想增加超时值)。

我想做的是能够使用发送到 GetDataAsync 的 dataID 采取行动(例如安排对 GetData 的新调用或向用户显示适当的错误消息,指示哪些数据流失败)。如何才能做到这一点? 如果我在 EndGetData 中设置断点,则 IAsyncResult 类型的结果参数将是一个 System.ServiceModel.Channels.ServiceChannel.SendAsyncResult 对象,该对象具有 RPC 属性,我可以在调试时找到该参数,但此类不可用代码,因为它被声明为 Friend。

这是否可能,或者有人对如何以另一种方式实现我想要的行为有想法?

【问题讨论】:

    标签: .net wcf silverlight silverlight-4.0 timeoutexception


    【解决方案1】:

    而是实现应该由 Visual Studio 自动生成的 Completed EventHandler。您也可以使用自己的 userState 值调用。

    void GetData(int dataID)
    {
      client.GetDataCompleted += GetDataCompleted;
      client.GetDataAsync(dataID, dataID); //the 2nd param being the userState object
    }
    
    void GetDataCompleted(object sender, GetDataCompletedEventArgs e)
    {
      var dataId = (int)e.UserState;
    }
    

    如果发生错误,EventArgs 也会包含异常:

    if (e.Error != null)
      throw e.Error;
    

    避免更改/使用自动生成的方法。

    【讨论】:

    • 我已经实现了 EventHandler,这就是我处理服务抛出的正确结果和错误的地方,问题是当错误出现时 dataId 没有随 GetDataCompletedEventArgs 一起提供(e.UserState 为 null)一个超时异常。
    • 嗯,很奇怪。我刚刚尝试了我的 WCF 操作之一,我的操作在 30 秒后超时,点击 Completed 事件并且 UserState 保持不变。调用 GetDataAsync 时是否将 dataId 明确指定为 userState 对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多