我有第三方网络服务参考,其中包含网络方法 AddDocument 。 我们的应用程序之前同步调用此方法,但我现在需要实现对此方法的异步调用。
我已通过选中“生成异步操作”复选框在我的项目中重新配置了Web服务引用。 现在我有一个 BeginAddDocument 方法,我称之为:
AsyncCallback callback = ProcessAsyncResult;
object asyncState = "TestAsyncState";
srv.BeginAddDocument(Credentials, document, callback, asyncState);
我准备了一个回调方法:
public void ProcessAsyncResult(IAsyncResult result)
{
}
有时Web服务会返回错误。 在同步调用方法时,可以轻松捕获和处理它们。
但遗憾的是,我找不到任何明确的答案如何使用异步方法捕获异常,请记住我无法修改Web服务本身。
无论操作结果如何,回调方法中的IAsyncResult似乎都是相同的 - 无论是成功还是异常。
是否有可能使用异步方法从Web服务中捕获异常,如果是,那么使它成为可能的最佳方法是什么?
答案 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
}
}