2014-01-09 82 views
0

我有一个第三方Web服务引用,它具有Web方法AddDocument。 我们的应用程序之前同步调用此方法,但现在需要实现对此方法的异步调用。处理来自异步WCF Web服务异常的异常

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

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

而且我已经准备回调方法的刺:

public void ProcessAsyncResult(IAsyncResult result) 
{ 
} 

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

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

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

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

回答

0

通常使用“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); 
+0

布兰登,非常感谢您的快速和翔实的答复。 的确,看起来好像在IAsyncResult参数上调用同一个服务对象上的EndAddDocument,通过抛出与以前同步调用中通常收到的完全相同的异常来解决问题。 再次感谢您的专业知识! – freeliner

0

至于布兰登在答复中建议,该解决方案是非常简单的,和对我来说并不清楚,只是由于我缺乏异步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 
     } 
    }