处理异步WCF Web服务调用中的异常

时间:2014-01-09 14:40:54

标签: c# wcf asynchronous

我有第三方网络服务参考,其中包含网络方法 AddDocument 。 我们的应用程序之前同步调用此方法,但我现在需要实现对此方法的异步调用。

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

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

我准备了一个回调方法:

public void ProcessAsyncResult(IAsyncResult result)
{
}

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

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

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

是否有可能使用异步方法从Web服务中捕获异常,如果是,那么使它成为可能的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

通常使用“BeginYYYxxx”ASync模式,您可以调用匹配的“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);

答案 1 :(得分:0)

正如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
        }
    }