处理来自异步WCF Web服务异常的异常
问题描述:
我有一个第三方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服务中捕获异常,如果是这样,那么使其成为可能的最佳方式是什么?
答
通常使用“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);
答
至于布兰登在答复中建议,该解决方案是非常简单的,和对我来说并不清楚,只是由于我缺乏异步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
}
}
布兰登,非常感谢您的快速和翔实的答复。 的确,看起来好像在IAsyncResult参数上调用同一个服务对象上的EndAddDocument,通过抛出与以前同步调用中通常收到的完全相同的异常来解决问题。 再次感谢您的专业知识! – freeliner