【问题标题】:Handling Exceptions from an Async WCF Web Service call处理来自异步 WCF Web 服务调用的异常
【发布时间】:2014-01-09 14:40:54
【问题描述】:

我有一个第三方网络服务参考,它有一个网络方法AddDocument。 我们的应用程序之前同步调用了这个方法,但是我现在需要实现对这个方法的异步调用。

我通过选中“生成异步操作”复选框在我的项目中重新配置了 Web 服务引用。 现在我有一个可用的 BeginAddDocument 方法,我称之为:

AsyncCallback callback = ProcessAsyncResult;
object asyncState = "TestAsyncState";
srv.BeginAddDocument(Credentials, document, callback, asyncState);

而且我已经为回调方法准备了一个刺:

public void ProcessAsyncResult(IAsyncResult result)
{
}

有时网络服务会返回错误。 在同步调用方法时可以轻松捕获和处理它们。

但不幸的是,我找不到任何明确的答案如何使用异步方法捕获异常,请记住我无法修改 Web 服务本身。

无论操作结果如何,回调方法中的 IAsyncResult 似乎都是相同的 - 无论是成功还是异常。

是否有可能使用异步方法从 Web 服务中捕获异常,如果可以,最好的方法是什么?

【问题讨论】:

    标签: c# wcf asynchronous


    【解决方案1】:

    通常使用“BeginYYYxxx”异步模式,您可以调用匹配的“EndYYYxxx”方法。假设他们已经使用这种模式编写了第三方服务,您应该能够从 IAsyncResult 的AsyncState 中获取结果对象。 documentation for IAsyncResult 可能对您有用。

    在没有看到服务文档的情况下,这是我最好的猜测:

    AsyncCallback callback = ProcessAsyncResult;
    object asyncState = "TestAsyncState";
    srv.BeginAddDocument(Credentials, document, callback, asyncState);
    
    
    public void ProcessAsyncResult(IAsyncResult result)
    {
        TypeThatsrvIs s = (TypeThatsrvIs)result.AsyncState;
    
        //"s" will be the same srv object that you called BeginAddDocument on.
        //It "should" contain the web-service result.
        s = s.EndAddDocument(result);
    
        /*
        Do stuff with that resulting object.
        */
    
    }
    

    希望对您有所帮助。

    编辑:您实际上可能必须将 srv 对象作为 AsyncState 传递,以便在 ProcessAsyncResult 方法中取回它:

    AsyncCallback callback = ProcessAsyncResult;
    object asyncState = srv;
    srv.BeginAddDocument(Credentials, document, callback, asyncState);
    

    【讨论】:

    • Brandon,非常感谢您快速而翔实的回复。是的,确实,似乎使用 IAsyncResult 参数在同一个服务对象上调用 EndAddDocument 解决了问题,方法是抛出与之前通常在同步调用中收到的完全相同的异常。再次感谢您的专业知识!
    【解决方案2】:

    正如 Brandon 在他的回复中建议的那样,解决方案非常简单,只是由于我缺乏异步 Web 方法调用模式的经验,我并不清楚。回调方法的结果代码如下:

    public void ProcessAsyncResult(IAsyncResult result)
        {
            ServiceSoapClient srv = result.AsyncState as ServiceSoapClient;
            if (srv == null) return;
            try
            {
                srv.EndAddDocument(result);
            }
            catch (WebException ex)
            {
                //your code to handle exception here
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多